c - 错误使用字符串化

标签 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 值?

最佳答案

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

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

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

关于c - 错误使用字符串化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39687652/

相关文章:

c - C 中两个程序之间的管道

c++ - 可以安全共享指针数据的多线程库?

gcc - 在哪里可以找到完整的 gcc 警告和错误列表?

iphone - Objective-C 宏重新定义

c - 执行 ELF IFUNC 调度函数时读取环境

c - 为什么动态分配(链表/树),c

c - 让 GCC 在 ./之前在 <dir> 中查找标题

c - 如何设置 gcc 以使用文件扩展名(.c 或 .cpp)来确定正确的编译器/链接器?

c - 了解宏行为和原线程

macros - 如何用SPSS求所有变量的最大值和最小值并显示在表格中?