【发布时间】:2015-02-16 17:31:50
【问题描述】:
我对宏扩展延迟有疑问。这是一个例子:
#include <stdio.h>
#define CONST_ABC 15
#define CONST_5 7
#define ABC 5
#define PRINT(x) printf("CONST=%d\n", CONST_ ## x)
// The problematic macro
#define PRINT2(x) PRINT(x)
int main(int argc, char *argv[])
{
PRINT(ABC); // Prints 15 - OK
PRINT2(ABC); // Prints 7 - Not OK.
}
如何定义PRINT2 宏以便它使用PRINT 并且结果为15?我得到:
CONST=15
CONST=7
又想得到:
CONST=15
CONST=15
【问题讨论】:
-
如果
PRINT给你想要的结果,你为什么不直接使用它呢? -
@rici 因为这是一个最小的例子。还有其他参数和更复杂的逻辑。
-
很公平,但基本思想是一样的。使用双重宏间接导致
x被重新扩展,不要做双重间接。 (将PRINT2定义为PRINT(CONST_ ## x)可能会起作用,明显更改为PRINT。)没有看到更接近实际问题的东西,很难知道还能说什么。 -
@rici 我必须使用一个宏。我什至不应该知道它在内部做了什么。所以我需要传递给定的参数(如果可能的话)。所以问题用一种简单的方式来描述:我得到了一个字面量,我必须将它作为字面量传递而不进行扩展。
标签: c c-preprocessor