2017-03-09 40 views
0

我是通过wxWidgets的的来源,当我看到这个代码命名一个类的空白?

class WXDLLIMPEXP_FWD_CORE wxKeyEvent; 

在此之后,他们定义的类像这样

class WXDLLIMPEXP_FWD_CORE wxKeyEvent : public wxEvent{ 
//some code 
}; 

正如你可以看到有一个白色的空间,但你不能有它而命名的班级,进一步我写了这个小代码编译成功`

#include <bits/stdc++.h> 

using namespace std; 

class a 
{ 
public: 
    int x; 
}; 

class a b 
{ 
    // it fails if i add anything there 
}; 

int main() 
{ 
    return 0; 
} 

这编译失败时,我里面添加东西CL屁股你能告诉我发生了什么事吗?

谢谢!

+0

'WXDLLIMPEXP_FWD_CORE'是一个宏。我想它变成了空白,所以它真的不是名称的一部分 – NathanOliver

+0

@Nathan没有真正扩展到空白。 –

+0

@πάνταῥεῖ如果这些东西是窗口相关的,那么你知道他们如何处理gtk,osx相关事件? – PrashantKumarNirmal

回答

7

WXDLLIMPEXP_FWD_CORE是应该添加(编译器特定的)类属性并扩展到__declspec(dllexport)__declspec(dllimport)的宏,具体取决于用于导出还是导入类。

您例如class a b { /* ... */ };简直是无效的语法,

类名不能包含空格。

0

对于宏定义,接受的答案是正确的,但对“无效语法”也有误导。

class a b { /* ... */ };实际上如果您的编译器支持uniform initialization,则为有效语法。在您提供的代码中,它会导致使用默认构造函数在全局名称空间中构造名为b的类型为a的变量。在这种情况下,class关键字的作用就像typename,即使没有它,代码也应该编译。

当您尝试定义括号内的变量时,它停止编译,因为这是统一初始化语法需要放置构造函数调用参数的地方。