2015-06-29 14 views
1

我試圖建立我的應用程序時,報告了以下錯誤:如何找到C++編譯器認爲定義爲常量的內容?

  • 錯誤C2143:語法錯誤:缺少「}」之前「常量」
  • 錯誤C2143:語法錯誤:缺少「;」之前「常量」
  • 錯誤C2059:語法錯誤:「常量」

對於下面的代碼:

namespace oP 
{ 
     enum adjustment 
     { 
     AUTO_OFF, 
     AUTO_ONCE, 
     AUTO_CONTINUOUS, 
     AUTO_SEMI, 
     ABSOLUTE,  // The line that the errors point to. 
     NUDGE 
     }; 
} 

小寫的「絕對」建立好了,如果我拼錯絕對然後它建立沒有錯誤。

我搜索了我的整個代碼庫,並且沒有其他地方使用術語「ABSOLUTE」。 我調查了沒有這個變化的構建的神器,我找不到任何對它的絕對引用。

有沒有人有指針什麼是錯的或如何調試呢?

由於

+1

您正在使用哪種編譯器? –

+3

你有一個在你的包含文件中的某個地方定義的宏。檢查它們;更簡單的方法是檢查預處理器的輸出。如果使用'g ++',在預處理階段後使用'-E'標誌停止。 – legends2k

+1

我懷疑某個標題(您的或第三方)將'ABSOLUTE'定義爲':: fabs'。如果它是C++標準庫的一部分,那麼這是一個糟糕的實現。 – Bathsheba

回答

3

您已經在您的包含文件中的某個位置定義了一個名稱中定義的宏;檢查它們。更簡單的方法是檢查預處理器的輸出。

如果您使用GCC,請在預處理階段後使用-E標誌停止。使用VC++編譯器,您應該使用/E和/或/P。詳細信息請參見How do I see a C/C++ source file after preprocessing in Visual Studio?


通常約定是以全部大寫的方式命名宏;這也適用於枚舉,如果您使用C++ 03的(普通)枚舉。更好的選擇是使用C++ 11的強類型scoped enumerations

每個條目的名稱可以在Pascal的情況下,並且使用枚舉的名稱裝飾,它們變得非常易讀Adjustment::Absolute,而不是舊的,未列表的枚舉的ABSOLUTE。這是不太可讀的,因爲讀者可能會與wingdi.h聲明的宏混淆(如Bathsheba指出的那樣)。除了可讀性外,它還避免污染封閉的名稱空間。

+0

「這也適用於枚舉」並非如此。 ALL_UPPER_CASE通常適用於宏,常量通過宏定義。枚舉和常量常量可以使用普通的命名約定。 [見Qt 4/5的例子](http://doc.qt.io/qt-5/qt.html)。您也可以在枚舉和命名空間中包含枚舉,這通常非常有用。 – SigTerm

+0

即使使用更強類型的作用域枚舉,預處理器是否不會用宏定義替換那些值? 無論如何,它現在都被oP :: ABSOLUTE引用。 – James

+0

@SigTerm當然,這就是爲什麼它是一個約定,而不是一個規則。但是我所見過的大多數代碼庫都傾向於使用宏和_枚舉的全部大寫。這是一個C-ISM。 – legends2k

6

ABSOLUTE#define d(數字1)在windows API頭<windi.h>之一。這就是編譯器的混淆。

你可以#undef它,刪除<windows.h>如果你不需要它,或者重命名你的枚舉。

2

您正在使用visual C++編譯器和#include那麼你應該得到這個錯誤。在WINDOWS.H文件的#include < WINGDI.H>包括在WINGDI.H你會發現

/* Coordinate Modes */ 
#define ABSOLUTE   1 
#define RELATIVE   2 

因此發生錯誤。

-1

如何找到C++編譯器認爲定義爲常量的內容?

如果你的編譯器是不願意生產有用信息(通常它打印在那裏項已經被定義),或者如果您懷疑自己愛上WinAPI的頭部宏觀巫術的受害者......

選擇性註釋掉代碼行並重新編譯以查明問題。 如果你註釋掉一行,然後你的程序編譯完成,行是你的問題的根源。如果您的代碼塊很大,請執行「二分查找」 - 將整個塊註釋掉一半,然後將其中一半註釋掉,以便快速縮小問題範圍。

在IDE中,您經常可以將鼠標懸停在項目上以查看其定義的位置,或者按一個鍵或使用上下文菜單「跳轉到定義」。

除此之外,您可以調查預處理器輸出。


,不能有選擇地註釋掉頭進行測試時,它的變化 - 因爲編譯器警告的新清單將是過於繁重通過

工作作空白* .cpp文件並將有問題的定義複製到它中,直到你破壞它爲止。這將允許您查明問題。

這是一個很好的做法,總是隻包含最少的必要頭文件到你自己的* .h文件中,最好完全避免OS特定的頭文件,儘管在這種情況下這是不可能的。

在你的特定情況下,另一個好的選擇是改變枚舉值的命名風格。通常,ALL_UPPERCASE僅用於宏(宏定義和宏常量)。此規則的一個明顯例外是在Windows頭文件中定義的minmax宏(它們可以被禁用)。因爲您在enum中使用了它,所以與操作系統特定的定義衝突。對於常量和局部變量,我會對枚舉使用相同的命名約定。

+0

這些都是一些有用的啓發式方法,但在這種情況下它們不會有幫助。我知道哪一行代碼給出了這個問題,並且不能有選擇地註釋掉頭部,以便測試它何時發生變化 - 因爲編譯器警告的新列表太過繁瑣。剛剛在Visual Studio中進行了測試 - 它無法獲取在頭文件中定義的ABSOLUTE。 – James

+1

@詹姆斯:最後一段適用於這種情況。除了IDE幫助,您無法真正瞭解符號的定義。此外,你可以註釋掉標題。將有問題的聲明覆制粘貼到空白* .cpp文件中,並開始添加標題直到您將其分解。 – SigTerm

相關問題