Undefine 宏定义了两次
Undefine macro defined twice
我想使用在不同头文件中定义的具有相同名称和不同实现的宏。
我有两个头文件 h1.h
和 h2.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...
#define
d 宏仅在预处理期间保留,并随着预处理器的进行而被替换。与普通编程中的变量类似,如果您重新分配它,预处理器将只使用新值来处理后续事件。
之所以有效,是因为在编译期间,pre-processor 到达 print1
中的 PRINT()
调用,计算宏,并将其替换为当前值。然后,如果我理解正确,稍后(在下一行中)您重新定义或取消定义 PRINT(通过包含另一个 header),然后对它的任何进一步引用将使 pre-processor 替换它又是当前值(现在不同了),因此调用 "same" 宏会得到 2 个不同的行为。
我想使用在不同头文件中定义的具有相同名称和不同实现的宏。
我有两个头文件 h1.h
和 h2.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...
#define
d 宏仅在预处理期间保留,并随着预处理器的进行而被替换。与普通编程中的变量类似,如果您重新分配它,预处理器将只使用新值来处理后续事件。
之所以有效,是因为在编译期间,pre-processor 到达 print1
中的 PRINT()
调用,计算宏,并将其替换为当前值。然后,如果我理解正确,稍后(在下一行中)您重新定义或取消定义 PRINT(通过包含另一个 header),然后对它的任何进一步引用将使 pre-processor 替换它又是当前值(现在不同了),因此调用 "same" 宏会得到 2 个不同的行为。