在VS2008和GCC中编译静态const int=X的最佳代码

Best code for compiling static const int = X in VS2008 and GCC

本文关键字:int 代码 最佳 const 静态 VS2008 GCC 编译      更新时间:2023-10-16

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

其他问题涵盖了静态const int类成员所需的规则。特别是,标准和GCC要求变量在一个且只有一个对象文件中有一个定义。

但是,Visual Studio在编译.cpp文件中包含定义的代码(在调试模式下(时会创建LNK2005错误。

我试图在两者之间做出决定的一些方法是:

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

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

我在答案中寻找的是一种好看的最佳实践方法,它可以构建代码,使GCC和MSVC同时感到满意。我希望得到一些我还没有想到的非常美丽的东西。

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

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

如果不能这样做,#ifdef会为MSVC取消.cpp中的定义,因为如果您取消声明中的值,它将始终获得存储;编译器不知道这个值,所以它不能内联它(好吧,如果启用了"链接时代码生成",应该能够解决这个问题(,并且不能在需要常量的地方使用它,比如值模板参数或数组大小。

如果你不喜欢使用非标准破解的想法,那么对于VC++来说,总有__declspec(selectany)。我的理解是,它将确保在链接时,通过删除除一个定义外的所有定义来解决任何冲突。您可以将其放入#ifdef _MSC_VER块中。

Visual C++2010接受以下内容:

// test.hpp:
struct test {
    static const int value;
};
// test.cpp:
#include "test.hpp"
const int test::value = 10;

这仍然是VS2013的一个问题。我已经解决了这个问题,将我的标准兼容定义放在cpp文件中,放在#if preventing VS.中

a.h:

class A
{
public:
  static unsigned const a = 10;
};

a.cpp:

#ifndef _MSC_VER
unsigned const A::a;
#endif

我也很好地评论了它,所以文件中的下一个人知道该怪哪个编译器。

相关文章: