【发布时间】:2017-03-31 09:57:07
【问题描述】:
我是宏定义的新手,这就是我通常想知道的原因: 如何避免收到重新定义警告?
我不确定我是否正确,但我只知道: 宏定义在头文件中进行。如果我在源代码中包含多个具有相同宏定义的头文件,我会收到有关重新定义宏的警告。 一种解决方案是删除其中一个包含以便只有一个宏定义。但是如果我真的需要所有的头文件来让我的程序正常工作怎么办?
我也知道我可以使用 #ifdef 或 #ifndef 检查是否定义了宏,但是如何以及在何处插入这些检查?进入头文件?还是在我包含头文件之前和之后?
作为一个例子,我有两个警告告诉我宏“__useHeader”和“__on_failure”被重新定义了,那么我该如何避免这些 警告?
【问题讨论】:
-
(a) 确保你使用了 include 守卫和 (b) 你可能需要用
#ifndef/#endif括起来宏定义。 -
首先,尽量避免使用宏。大多数时候在(现代)C++ 中它们并不是真正需要的。其次,请花点时间阅读What are the rules about using an underscore in a C++ identifier?。第三,为什么要在多个头文件中定义相同的宏?
-
或者您是否在同一个translation unit 中多次包含同一个头文件,从而收到宏重新定义警告?那么你应该阅读include guards。
-
#ifndef/#define对是包含保护的最差选择,最好在每个.h文件的开头使用#pragma once。 -
@Someprogrammerdude 宏定义在 specstrings_supp.h 和 sal_supp.h 所以我没有自己创建它们 - 结果我不能真正避免定义宏。我首先认为相同的宏定义在多个herader文件中,但显然我多次包含相同的头文件。 #pragma once 删除了警告。谢谢!
标签: c++ macros header-files redefinition