2017-03-09 5 views
0

나는 당신이 공백이 볼 수 있듯이 그들은이클래스 이름을 지정하는 데 공백이 있습니까? 나는이 후이 코드</p> <pre><code>class WXDLLIMPEXP_FWD_CORE wxKeyEvent; </code></pre> <p>을보고

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

같은 클래스를 정의 wxWidgets에의 소스를 통해,하지만 당신은 할 수 없습니다 그것은 클래스를 명명하는 동안 더 성공적으로 컴파일하는이 작은 코드를 작성했습니다. '

#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에 뭔가를 추가하면 컴파일되지 않습니다. 엉덩이 a. b. 무슨 일인지 말해 줄래?

감사합니다.

+0

'WXDLLIMPEXP_FWD_CORE' 매크로입니다. 나는 이것이 공백이되어 실제로는 이름의 일부가 아닐 것이라고 생각한다. – NathanOliver

+0

@ Nathan 정말로 공백으로 확장되지 않는다. –

+0

@ πάνταῥε these 이러한 것들이 윈도우와 관련되어 있다면 gtk, osx 관련 이벤트를 어떻게 처리 할 수 ​​있는지 알고 있습니까? – PrashantKumarNirmal

답변

7

WXDLLIMPEXP_FWD_CORE은 (컴파일러 관련) 클래스 특성을 추가해야하는 매크로이며 클래스를 내보내거나 가져 오는 데 사용되는 경우에 따라 __declspec(dllexport) 또는 __declspec(dllimport)으로 확장됩니다.

당신의 예를 class a b { /* ... */ };

클래스 이름은 공백을 포함 할 수 없습니다, 단순히 유효하지 않은 구문입니다.

0

허용되는 대답은 매크로 정의와 관련하여 올바르지 만 "유효하지 않은 구문"에 대한 오해의 소지가 있습니다.

class a b { /* ... */ }; 실제로 uniform initialization을 지원하는 유효한 구문 인 경우입니다. 당신이 제시 한 코드에서는 기본 생성자를 사용하여 b 형식의 a 변수를 전역 이름 공간에 생성합니다. class 키워드는이 경우 typename처럼 작동하며 코드는 컴파일하지 않아도 컴파일해야합니다.

대괄호 안에 변수를 정의하려고하면 컴파일이 중지됩니다. 그 이유는 초기화 초기화 구문에서 생성자 호출 인수가 있어야하기 때문입니다.