Undefine 宏定义了两次

Undefine macro defined twice

我想使用在不同头文件中定义的具有相同名称和不同实现的宏。 我有两个头文件 h1.hh2.h。在我定义的第一个头文件中:

#define PRINT  printf(" hi , macro 1\n"); 

并且在第二个头文件中

#define PRINT  printf(" hi , macro 2\n");

main() 中,当我尝试使用 PRINT 时,它会根据包含的顺序进行打印。 我发现了一些类似的问题,他们使用了一个包装器,包括第一个头文件然后定义一个内联方法:

inline void print1() {
      PRINT();
}

然后取消定义 PRINT 并包含第二个头文件。在 main() 中,当我调用 print1() 和 PRINT 时,我得到了它们的输出。 我缺少的一点是,在我们从第一个头文件中取消定义 PRINT 之后,我们如何仍然能够拥有它——换句话说,当我们在内联函数中调用它时会发生什么?编译器是否复制了 PRINT 的值并将其分配给函数并以某种方式保存了函数?

如果我没理解错的话,是这样的:

#include "h1.h" // defines PRINT: printf(" hi , macro 1\n"); 

inline void print1(){
    PRINT();
}

#undef PRINT

#include "h2.h" // defines PRINT: printf(" hi , macro 2\n");

虽然没有发生任何奇怪的事情。预处理器在未定义之前在内联函数中替换 PRINT 。所以在生成的代码中(当你用 GCC 的 -E 标志编译时你可以看到这个),它变成了这样:

// contents of h1.h...

inline void print1(){
    printf(" hi , macro 1\n");
}

// contents of h2.h...

#defined 宏仅在预处理期间保留,并随着预处理器的进行而被替换。与普通编程中的变量类似,如果您重新分配它,预处理器将只使用新值来处理后续事件。

之所以有效,是因为在编译期间,pre-processor 到达 print1 中的 PRINT() 调用,计算宏,并将其替换为当前值。然后,如果我理解正确,稍后(在下一行中)您重新定义或取消定义 PRINT(通过包含另一个 header),然后对它的任何进一步引用将使 pre-processor 替换它又是当前值(现在不同了),因此调用 "same" 宏会得到 2 个不同的行为。