2015-06-26 17 views
7

Ich habe den folgenden Code (vereinfacht), die in gcc fein kompiliert, sondern gibt einen Fehler in VS:VS2013 - static const definiert bereits

// main.cpp 
#include "test.h" 
int main() { 
    return 0; 
} 

// test.h 
#pragma once 
class Test { 
    static const int TEST = 3; 
}; 

// test.cpp 
#include "test.h" 
const int Test::TEST; 

Fehler:

main.obj : error LNK2005: "private: static int const Test::TEST" ([email protected]@@0HB) already defined in test.obj 

Ist es ein VS Bug oder ist gcc falsch erlaubt mir das statische const Mitglied explizit zu definieren?

Update: fanden diese in der C++ Standard (9.4.2.3):

If a non-volatile const static data member is of integral or enumeration type, its declaration in the class definition can specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression (5.20). A static data member of literal type can be declared in the class definition with the constexpr specifier; if so, its declaration shall specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression. [ Note: In both these cases, the member may appear in constant expressions. — end note ] The member shall still be defined in a namespace scope if it is odr-used (3.2) in the program and the namespace scope definition shall not contain an initializer.

Update # 2: ein bug report gefunden, die behauptet, dass es in der nächste große Version fixiert ist.

+0

Was passiert, wenn Sie 'const int Test :: TEST;' von Ihrer 'test.cpp' entfernen, wird gcc den Code kompilieren? – ixSci

+0

Es scheint zu funktionieren, aber ich arbeite mit Code, der explizit diese Zeilen definiert und nicht bearbeiten will, da es beim nächsten svn-Update wieder kaputt gehen wird. – riv

+0

Danke, ich wollte nur wissen, ob gcc einen Fehler anderer Art hat. Ich dachte, es erfordert, dass Sie die Konstante in allen Fällen explizit definieren. Wenn dies nicht der Fall ist, gibt es nur einen Fehler in MSVC. – ixSci

Antwort

2

Genau wie Sie sagten, es war ein MSVC bug. Der Code kompiliert und läuft perfekt in Visual Studio 2015 RC mit Standard-Projektoptionen.

enter image description here

Der Compiler denkt "static const int TEST = 3;" und "const int Test :: TEST;" sind zwei verschiedene Definitionen derselben Variablen. Um dies zu beheben in Ihrer Version können Sie versuchen, den statischen Variable Wert in der CPP-Datei festlegen:

// test.h 
#pragma once 
class Test { 
    static const int TEST; 
}; 

// test.cpp 
#include "test.h" 
const int Test::TEST = 3; 
1

Mit Microsoft Extensions to C and C++ aktiviert, Compiler generieren die Out-of-Class-Definition automatisch. Einige Compiler-Versionen sind wahrscheinlich fehlerhaft und führen diese automatische Definition auch dann aus, wenn Sie sie manuell definiert haben (z. B. beim Schreiben von tragbarem Code).

Sie können entweder die Erweiterungen deaktivieren oder nach dem Makro _MSC_EXTENSIONS suchen. Es ist definiert, wenn die Option/Ze festgelegt ist. Beispiel:

#ifndef _MSC_EXTENSIONS 
    const int MyClass::MyStaticMember; 
#endif 
Verwandte Themen