c++ - 更安全的条件编译?

标签 c++ visual-studio visual-c++ c-preprocessor

在 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 01,但我不得不写类似的东西

#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/

相关文章:

visual-studio - Azure Web 部署 "Publish Failed"

c# - 摘要,为成员忽略了格式错误的 XML 注释

c++ - 使用 VC++ 9.0 从 Web 服务器下载图像文件

c++ - 使用 C++ 更新 XML 节点值

c++ - Microsoft C++ 编译器有错误吗?

c++ - x64 函数调用参数推送/移动顺序 (MSVC)

c++ - 甚至在创建该类之前声明一个对象

c++ - 在给定的世界坐标处修改网格上的纹理

c++ - Hippomock 的 MockRepository::BasicRegisterExpect 中的 NotImplementedException

.net - Visual Studio 中缺少 package.appxmanifest