相关疑难解决方法(0)

如何使用C预处理器连接两次并扩展宏,如"arg ## _ ## MACRO"?

我正在尝试编写一个程序,其中一些函数的名称依赖于某个宏变量的值,宏如下:

#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并单独列出所有情况,但我想知道是否有一个聪明的方法来做到这一点.

c concatenation token c-preprocessor

141
推荐指数
3
解决办法
7万
查看次数

为什么这些连续的宏替换不会导致错误?

该程序将输出设为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)

为什么没有错误?

c macros

3
推荐指数
1
解决办法
98
查看次数

我们可以在多行中编写一个没有反斜杠的宏吗?

我在 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 处理宏参数中的任意指令的方式与它处理指令的方式完全相同,如果不存在类似函数的宏调用。

如果在宏调用中,该宏被重新定义,则新定义在参数预扩展时及时生效,但原始定义仍用于参数替换。这是一个病理学例子:

 #define f(x) x x
 f (1
 #undef f
 #define f 2
 f)
Run Code Online (Sandbox Code Playgroud)

扩展到

 1 2 1 2
Run Code Online (Sandbox Code Playgroud)

具有上述语义。

这个例子有很多行。

c gcc c-preprocessor

0
推荐指数
1
解决办法
3170
查看次数

标签 统计

c ×3

c-preprocessor ×2

concatenation ×1

gcc ×1

macros ×1

token ×1