簡體   English   中英

VS2013-靜態const已經定義

[英]VS2013 - static const already defined

我有以下代碼(簡體),可以在gcc中很好地編譯,但是在VS中卻報錯:

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

錯誤:

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

是VS錯誤還是gcc錯誤地允許我顯式定義靜態const成員?

更新:C ++標准 (9.4.2.3)中找到了這一點:

如果非易失性const靜態數據成員為整數或枚舉類型,則其在類定義中的聲明可以指定大括號或相等初始化器,其中每個作為賦值表達式的初始化子句都是一個常量表達式(5.20 )。 可以使用constexpr說明符在類定義中聲明文字類型的靜態數據成員; 如果是這樣,則其聲明應指定大括號或相等的初始化程序,其中每個作為賦值表達式的初始化程序子句都是一個常量表達式。 [注意:在這兩種情況下,成員都可能出現在常量表達式中。 — [結束說明] 如果在程序中使用了成員(3.2),則該成員仍應在命名空間范圍中定義,並且該命名空間范圍定義不應包含初始化程序。

更新#2:找到了一個錯誤報告 ,該報告聲稱已在下一個主要版本中對其進行了修復。

就像您說的那樣,這完全是MSVC 錯誤 該代碼可以在Visual Studio 2015 RC中使用默認項目選項完美地編譯和運行。

在此處輸入圖片說明

編譯器認為“ static const int TEST = 3;” 和“ const int Test :: TEST;” 是同一變量的兩個不同定義。 要在您的版本中解決此問題,您可以嘗試在.cpp文件中設置靜態變量值:

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

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

啟用Microsoft對C和C ++的擴展后 ,編譯器會自動生成類外定義。 某些編譯器版本可能存在錯誤,即使您手動定義了此定義(例如,在編寫可移植代碼時),也會執行此自動定義。

您可以禁用擴展名,也可以檢查_MSC_EXTENSIONS宏。 它是在設置/ Ze選項時定義的。 例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM