用空括号定义会发生什么?例:#define FOO()
What happens in a define with empty parentheses? ex: #define FOO ()?
简单地说,在我的c++知识(或缺乏)中,FOO在定义时将被括号中的内容所取代。但是如果括号是空的呢?它是否等于0?这意味着#ifdef foo (0)
会和#ifdef foo ( )
做同样的事情?如果相等,空括号有什么有用的效果吗?
一个宏展开后将会被展开为它所要展开的内容:
#include <stdio.h>
#define L (
#define R )
#define l {
#define r }
#define LR ()
int main LR
l
printf L "Hello, Worldn" R;
return 0;
r
可以很好地编译(如果你把L/R/L/R宏隐藏在头文件中,没有人会明白你做了什么。)请注意,至少在某些地方需要空格,以确保宏实际展开。
这句话
#ifdef CRAPFOO ()
不会编译干净(在gcc中"在#ifdef的末尾有额外的标记"),其他编译器可能会给出其他错误。
#define CRAPFOO ()
#ifdef CRAPFOO
do something
#else
not something
#endif
将给出do something
作为结果。
#define
是一个绝对愚蠢的文本替代。所以:
#define FOO ()
int main()
{
FOO;
}
是
int main()
{
();
}
你可以用-E
选项来测试g++
(我认为clang
也是),这意味着"只是做预处理",或者等价地,只是运行cpp
工具,这是c预处理器。例如
$ echo -e "#define FOO ()nint main()n{n FOO;n}" > def.cpp ; g++ -E def.cpp
# 1 "def.cpp"
# 1 "<command-line>"
# 1 "def.cpp"
int main()
{
();
}
(这些是Linux/其他Unix命令行工具)
#define
是一个预处理器指令,只是一个愚蠢的文本替换规则,在实际编译代码之前发生。在应用宏定义时还没有代码模型。
#define FOO ()
用()
替换出现的FOO
。
#define FOO (0)
将出现的FOO
替换为(0)
。
#define FOO 0
用0
替换FOO
的每一次出现,这是而不是与(0)
相同(在某些情况下这会产生差异)。
#define FOO()
将FOO()
替换为none,不触及FOO
相关文章:
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 反转C++ foo(MyClass &) vs foo(const MyClass &)
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- 如何实现这个函数 foo.getSize().x.
- Clearing Class Foo with new(pFoo) Foo()
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 用空括号定义会发生什么?例:#define FOO()