我正在尝试编写一个程序,其中一些函数的名称依赖于某个宏变量的值,宏如下:
#define VARIABLE 3
#define NAME(fun) fun ## _ ## VARIABLE
int NAME(some_function)(int a);
Run Code Online (Sandbox Code Playgroud)
不幸的是,宏NAME()将其转化为
int some_function_VARIABLE(int a);
Run Code Online (Sandbox Code Playgroud)
而不是
int some_function_3(int a);
Run Code Online (Sandbox Code Playgroud)
所以这显然是错误的方式.幸运的是,VARIABLE的不同可能值的数量很小所以我可以简单地做一个#if VARIABLE == n并单独列出所有情况,但我想知道是否有一个聪明的方法来做到这一点.
该程序将输出设为5.但是在替换所有宏之后,它将导致--5.这应该导致编译错误,试图减少5.但它编译并运行良好.
#include <stdio.h>
#define A -B
#define B -C
#define C 5
int main()
{
printf("The value of A is %d\n", A);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么没有错误?
我在 CPP 手册中看到了一些例子,我们可以在没有反斜杠的情况下在多行中编写宏主体。
#define strange(file) fprintf (file, "%s %d",
...
strange(stderr) p, 35)
Run Code Online (Sandbox Code Playgroud)
输出:
fprintf (stderr, "%s %d", p, 35)
Run Code Online (Sandbox Code Playgroud)
它们是像参数宏中的指令这样的特殊情况还是只允许用于 #define ?
对于包含指令,如果我没记错的话,它必须始终在一行中声明。
编辑:
来自https://gcc.gnu.org/onlinedocs/cpp/Directives-Within-Macro-Arguments.html
3.9 宏参数中的指令
有时,在宏的参数中使用预处理器指令会很方便。C 和 C++ 标准声明这些情况下的行为是未定义的。GNU CPP 处理宏参数中的任意指令的方式与它处理指令的方式完全相同,如果不存在类似函数的宏调用。
如果在宏调用中,该宏被重新定义,则新定义在参数预扩展时及时生效,但原始定义仍用于参数替换。这是一个病理学例子:
Run Code Online (Sandbox Code Playgroud)#define f(x) x x f (1 #undef f #define f 2 f)扩展到
Run Code Online (Sandbox Code Playgroud)1 2 1 2具有上述语义。
这个例子有很多行。