我的代码如下:为什么宏在这种情况下不起作用?
funcA() {
#define strdup(a) NULL
funcB();
}
虽然funcB()在另一个文件。我发现marco strdup(a)
不起作用。我可以如何使它工作?
我的代码如下:为什么宏在这种情况下不起作用?
funcA() {
#define strdup(a) NULL
funcB();
}
虽然funcB()在另一个文件。我发现marco strdup(a)
不起作用。我可以如何使它工作?
我假设funcB
使用strdup
,否则你的问题没有意义。
宏只与预处理器相关,不会传播到不同的编译单元。如果funcB
位于不同的编译单元中,那么该宏也需要在那里定义,这通常通过将包含该宏的头部包括到需要它的所有编译单元中来实现。
它不起作用,因为包含funcB
的源文件不知道您的宏。
宏在预处理过程中展开,不会传播到不同的翻译单元。也就是说,解决这个问题的常用方法是将宏定义放在头文件中。包含每个需要宏定义的源文件。
从C标准另外:
6.10.3.5宏德音响nitions
宏德音响nition持续(独立块结构的),直到对应
#undef
指令遇到或范围(如果没有遇到)直到预处理结束 翻译单元。宏定义在翻译阶段4后没有意义。
因此它不需要计算函数范围。
定义与标准库名称相同名称的宏是未定义的行为。 –
@KerrekSB:为什么? – alk
我在做单元测试。 – user1952216