2010-08-23 56 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