错误使用字符串化

时间:2016-09-25 13:59:59

标签: c gcc macros c-preprocessor stringification

给出以下代码:

#define MY_STRINGIFY_MACRO(...) #__VA_ARGS__

#define PORT_MAC(portNum) port: portNum

#define LOG_MACRO(...)
     printf( MY_STRINGIFY_MACRO(__VA_ARGS__) ) 

void func(int portNum)
{
    LOG_MACRO( PORT_MAC(portNum) ); /* In a more general way I would use this macro as LOG_MACRO( PORT_MAC(portNum), PORT_MAC(portNum1) ... ); to get output of " port: 2, port: 3 ... "*/
}

使用端口号调用func()时,例如2,输出为:

 port: portNum

而不是

 port: 2

如果我按照以下方式使用宏:

 LOG_MACRO( PORT_MAC(2) );

然后我得到了所需的输出:

 port: 2     

如何修复我的代码以便它可以处理这两种情况并且输出将始终包含portNum值?

1 个答案:

答案 0 :(得分:1)

你似乎对编译时与运行时感到困惑。

宏在编译时运行(在对代码执行任何其他操作之前)。更换发生时的情况。此时,CPP(C预处理器)唯一考虑的是文本。它没有看到任何其他东西(甚至不关心它是有效的C代码!)。然后编译代码并获得二进制文件(默认为a.out)。

此时,没有代码执行。没有调用任何函数。只有在启动程序时($ ./a.out)才会调用函数,并传递参数。你想做什么是不可能的。您唯一的选择是在运行时替换文本。