在VS2008和GCC中编译静态const int=X的最佳代码
Best code for compiling static const int = X in VS2008 and GCC
我在编写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
我也很好地评论了它,所以文件中的下一个人知道该怪哪个编译器。
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 错误:从"int"到"int*"的转换无效[-允许].我在下面提供了我的代码,我
- 错误:'int'之前的预期主表达式以及代码中的许多类似错误
- 为什么即使此代码使用 int,仍被视为 VLA?
- 这行代码中的内存是如何分配"int **v = new int*[n]; "的?
- *(int*)&data[18]在这段代码中实际上做了什么?
- 代码中的"vector<<int>vector>&index"是什么意思?
- 在给定的代码中,有人可以解释一下(int i = 0; i<len; i++)count[str[i]]++的代码片段;
- 为什么在此代码中使用 auto 和 int 给出不同的答案?
- 我正在编写一个代码来将 int 数组存储在文件中,然后用 c++ 检索它,但是检索第一项是假值,我该如何解决这个问题?
- int 相对于C++中主代码的目的
- 当我使用长整型时,我的代码不起作用,它与 int 一起工作得很好
- 为什么我的代码无法将字符串正确转换为 int 数组?
- 这个(const vector<vector<int> > &A)"代码段是什么意思?
- 处理代码重新定义int类型(uint16_t,int16_t等),并不喜欢它
- 是否仍然有理由在C++代码中使用"int"
- 我的 c++ 程序不打印任何字符,但是如果我将它们更改为 int,代码可以完美运行
- 为什么将字符'g'读入 int 会产生此代码中的数字 -858993460?
- 如何识别int代码值属于枚举中的哪个常量
- 在<int>代码块结束之前释放分配给 std::vector 的内存的正确方法