【发布时间】:2017-03-20 08:22:49
【问题描述】:
是否可以在不同的头文件中定义同名的宏 例如,在头文件 a.h 和 b.h 我们都定义了具有相同标识符的宏
【问题讨论】:
-
只要两个标题永远不会包含在同一个翻译单元中并且不会更改将在多个地方使用的任何定义,它就是合法,尽管听起来像一个非常糟糕的主意......这完全取决于你想用它做什么?
标签: c macros c-preprocessor
是否可以在不同的头文件中定义同名的宏 例如,在头文件 a.h 和 b.h 我们都定义了具有相同标识符的宏
【问题讨论】:
标签: c macros c-preprocessor
只要两个文件不放在一起,就完全没有问题。
如果您想包含这两个文件,请确保在包含第二个文件之前取消定义此重复符号。
【讨论】:
如果您没有在同一个文件中同时包含 a.h 和 b.h,那么一切都很好。编译器甚至不会抱怨。 如果您确实在同一个文件中声明了两个包含,编译器将引发警告,并将采用最新声明的包含的值,因为编译器必须做出选择。 例如:
#define foo 1 (a.h)
#define foo 2 (b.h)
在 foo.c 中:
#include "a.h"
#include "b.h"
foo 将给出 2 的值,因为它是最后包含的。
如果你还想继续使用它,别忘了undef复制其中一个。
但是这种操作非常糟糕,因为您的代码将变得可读性降低它会有未定义的行为并且他们很有可能甚至迷失在自己的代码中。
【讨论】:
inline 函数的定义基于此宏而更改,被包含在两个翻译单元中使用不同版本的宏。
#define foo 1 后跟#define foo 1,但不能有#define foo 2