【问题标题】:C define Macro with same name in different header?C在不同的标题中定义具有相同名称的宏?
【发布时间】:2017-03-20 08:22:49
【问题描述】:

是否可以在不同的头文件中定义同名的宏 例如,在头文件 a.h 和 b.h 我们都定义了具有相同标识符的宏

【问题讨论】:

  • 只要两个标题永远不会包含在同一个翻译单元中并且不会更改将在多个地方使用的任何定义,它就是合法,尽管听起来像一个非常糟糕的主意......这完全取决于你想用它做什么?

标签: c macros c-preprocessor


【解决方案1】:

只要两个文件不放在一起,就完全没有问题。
如果您想包含这两个文件,请确保在包含第二个文件之前取消定义此重复符号。

【讨论】:

    【解决方案2】:

    如果您没有在同一个文件中同时包含 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 函数的定义基于此宏而更改,被包含在两个翻译单元中使用不同版本的宏。
    • @BoBTFish - 如果那个函数和宏没有被组织成一个单一的有凝聚力的代码段(尽可能多),那么这个代码库就有更大的问题。
    • @StoryTeller 我 100% 同意,但根据这个问题,这听起来像是一种可能性。
    • 这是错误的,C 标准说你不能在没有 undef 的情况下用不同的替换列表重新定义宏,否则行为是未定义的。只能有#define foo 1 后跟#define foo 1,但不能有#define foo 2
    • 如果 C 标准说不应该做某事,声称它是“可能的”或“预期某些行为”是完全错误的,特别是因为 OP 没有提到他们的编译器重新使用。
    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多