在 MSVC C++ 程序中,我有一部分代码要根据预处理器定义启用或禁用
// 1.h
#ifdef MYOPTION
//...
#endif
但我发现在多个编译单元中包含的 .h 文件中使用它时非常危险,因为我很容易得到不一致的 header (我不想全局定义 MYOPTION,因为它需要一个每次更改时都要重新编译):
// 1.cpp
#define MYOPTION
#include "1.h"
// 2.cpp
#include "1.h"
当然,由于链式 header 包含,它比这个简化的示例复杂得多。
有没有办法避免这种不一致,例如不费吹灰之力就出现编译时错误?
我想做 #define MYOPTION 0
或 1
,但我不得不写类似的东西
#if MYOPTION == 1
//...
#elif !defined(MYOPTION)
#error ...
#endif
这看起来太复杂了……也许有更好的选择?
最佳答案
这样的事情怎么样:让 1.h 使用不同的选项在 obj 中定义一个虚拟部分。这样,如果 MYOPTION 的使用不一致,链接器将发出警告。
1.h:
#ifdef MYOPTION
#pragma section("MYOPTION_GUARD",write)
#else
#pragma section("MYOPTION_GUARD",read)
#endif
namespace { __declspec(allocate("MYOPTION_GUARD")) int MYOPTION_guard; }
使用 a.cpp 中定义但不在 b.cpp 中定义的 MYOPTION 进行编译会产生此链接器警告(使用 VC 2008):
b.obj : warning LNK4078: multiple 'MYOPTION_GUARD' sections found with different attributes (40300040)
一致的定义根本不会产生链接器警告。
关于c++ - 更安全的条件编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5046159/