c++ - 在 VS2008 和 GCC 中编译 static const int = X 的最佳代码

标签 c++ visual-c++ gcc cross-platform

我在编写需要在 Visual Studio 2008 和 GCC 4.6 中编译(并且还需要编译回 GCC 3.4)的 C++ 代码时遇到了一个问题:static const int 类成员。

Other questions have covered static const int 类成员所需的规则。特别是,标准和 GCC 要求变量在一个且仅一个目标文件中有定义。

但是,Visual Studio 在编译包含 .cpp 文件中的定义的代码(在 Debug模式下)时会产生 LNK2005 错误。

我试图在其中做出决定的一些方法是:

  • 使用 .cpp 文件中的值而不是 header 对其进行初始化。
  • 使用预处理器删除 MSVC 的定义。
  • 将其替换为枚举。
  • 用宏替换它。

最后两个选项没有吸引力,我可能不会使用任何一个。第一个选项很简单——但我喜欢在 header 中包含值。

我在答案中寻找的是一种外观漂亮的最佳实践方法,用于构建代码以使 GCC 和 MSVC 同时满意。我希望有一些我还没有想到的美妙绝伦的东西。

最佳答案

我通常更喜欢enum 方式,因为这样可以保证它始终被用作即时值,不会获得任何存储空间。它被编译器识别为常量表达式。

class Whatever {
    enum { // ANONYMOUS!!!
        value = 42;
    };
    ...
}

如果你不能这样做,#ifdef 去掉 MSVC 的 .cpp 中的定义,因为如果你 ifdef 去掉声明中的值,它将总是得到存储;编译器不知道这个值,所以它不能内联它(好吧,“链接时间代码生成”如果启用的话应该能够修复它)并且不能在需要常量的地方使用它,比如值模板参数或数组大小。

关于c++ - 在 VS2008 和 GCC 中编译 static const int = X 的最佳代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7263433/

相关文章:

c++ - 使用 istreambuf_iterator<char>(ifstream(..., ios::binary)) 进行奇怪的行结束转换(CR、LF、CRLF)

为 "-std=gnu90"编译 C 项目错误

c++ - 使用 gcc 和 clang 的可变宏扩展的奇怪行为

c++ - 使用 ofstream 写入带有临时缓冲区的文件

c++ - 调试——类/对象的东西,菜鸟问题

c++ - 将 double 值格式化为小数点后一位

MFC : creating a hyperlink in a button

c++ - 从字符数组中消除重复项

c++ - 如何用Media Foundation生成 "moov before mdat"MP4视频文件

c++ - 从<iostream.h> 更改为<iostream> 会导致缓冲区溢出吗?