2010-08-23 68 views
3

下面是發生在我身上的事情,我不知道怎麼回事。我的同事和我把我們的頭擰到了這裏。這是一個跨平臺的庫在Windows上使用成員函數聲明的奇怪錯誤

的跨平臺工具包wxWidgets的
#include <wx/wx.h> 

class Graph { 
public: 
    // ... 
    // main1.cpp:4:10: error: expected identifier before '(' token 
    double GetYValue(double x); 
}; 

我們努力的尋找,而不是放在一個ASCII e或某事的任何奇怪的字形,但沒有發現任何這樣的問題。發生了什麼事?!

+6

'GetYValue'是一個宏嗎? – GManNickG 2010-08-23 20:29:02

+2

看起來它可能是一個正在改變'GetYValue'文本(或者它之前的東西)的宏替換,但我對wxWidgets猜測的內容不夠了解。你在預處理後檢查了那條線的樣子嗎? – 2010-08-23 20:29:52

+2

看到你問這樣的問題很奇怪,通常你是回答他們的人! – 2010-08-23 20:39:14

回答

9

WINGDI.H LN 640:#define GetYValue(cmyk) ((BYTE)((cmyk)>> 8))

愛是愛WINDOWS.H

這就是爲什麼我建議不要使用駱駝案例最多的事。

+0

但是大多數(我讀過的每一個)標準都說使用MACROS的所有大寫字母。因此,我的建議是不要使宏不是全部大寫,也不要使全部大寫的函數。 – 2010-08-23 20:40:53

+0

是啊哈哈這是xD的問題http://msdn.microsoft.com/en-us/library/dd372091%28VS.85%29.aspx傻的windows.h ... – 2010-08-23 20:43:43

+0

是的,''是一種有害生物。它將數千個通用標識符作爲宏來污染。該頭文件最好侷限於幾個'.cpp'文件。而wxWidgets只是把它拖到任何地方,所以同樣的建議適用。或者完全放棄CamelCase來支持std_lib_convention(無論命名爲何)。 C++ std lib污染少得多。 – sbi 2010-08-23 20:53:07

6

我的第一個猜想是,<wx/wx.h>有一個名爲宏GetYValue(也可能是另一個名爲GetXValue),都應該採取某種組合的X/Y值和「解包」他們到他們的單個組件,一般順序的:

#define GetXValue(xy) ((xy)>>16) 
#define GetYValue(xy) ((xy)&x0ff) 

隨着將膨脹了,你的代碼看起來是這樣的:

double ((xy)>>16)(double x); 

...此時編譯器有噓聲像契合 - 除非,當然,這可能給立即解析因爲double x似乎試圖將兩個令牌作爲參數傳遞給僅預期爲1的宏。

編輯:我看到我猜測的相當接近,但猜測錯誤的是涉及到什麼類型的「Y」在這裏 - 其他人顯然是GetCValue,GetMValue等,而不是GetXValue。哦,好吧......

+0

+1各種不錯的解釋。不知道我要接受什麼。這樣一個艱難的決定! – 2010-08-23 20:44:51