错误使用字符串化
Wrong use of 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
值?
您似乎对编译时与运行时感到困惑。
宏在编译时运行(在对您的代码执行任何其他操作之前)。那就是更换发生的时候。此时,CPP(C 预处理器)唯一考虑的就是文本。它看不到任何其他东西(甚至不关心它是有效的 C 代码!)。然后你的代码被编译并且你得到你的二进制文件(默认为a.out
)。
此时,没有代码执行。没有函数被调用。只有在您启动程序 ($ ./a.out
) 时才会调用函数并传递参数。你想做的事是不可能的。您唯一的选择是在运行时替换文本。
给定以下代码:
#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
值?
您似乎对编译时与运行时感到困惑。
宏在编译时运行(在对您的代码执行任何其他操作之前)。那就是更换发生的时候。此时,CPP(C 预处理器)唯一考虑的就是文本。它看不到任何其他东西(甚至不关心它是有效的 C 代码!)。然后你的代码被编译并且你得到你的二进制文件(默认为a.out
)。
此时,没有代码执行。没有函数被调用。只有在您启动程序 ($ ./a.out
) 时才会调用函数并传递参数。你想做的事是不可能的。您唯一的选择是在运行时替换文本。