2012-03-19 2 views
2

이상한 상황에 처했습니다. 필자는 #ifndef #define #endif 플래그를 모든 .h 파일에 넣으면 include 헤더 파일의 순서가 중요하지 않다는 것을 이해합니다.'-'토큰 앞에 unqualified-id가 필요합니다.

오래된 코드 a.h

#ifndef A_H 
#define A_H 
    blah blah blah 
#endif 

a.cc는

#include "a.h" 
blah blah blah 

그리고 코드 위

괜찮 았는데.

는 지금은

#ifndef B_H 
#define B_H 
    blah blah blah 
#endif 

새로운 a.cc

#include "a.h" 
#include "b.h" 
blah blah blah 

확인을 컴파일 위의 a.cc b.h

b.h 새로운 헤더를 추가했다. 그러나 나는

새로운 a.cc 버전 오류로 인해 실패 컴파일이

#include "b.h" 
#include "a.h" 
blah blah blah 

에 a.cc을 변경하는 경우 : 이전에 자격이-ID 기대 '-'토큰.

죄송합니다. 아주 작은 예제에서는 같은 오류를 재현 할 수 없습니다. 컴파일 오류로 큰 프로젝트가 발생했습니다. 그리고 위와 같이 만든 작은 예제로 테스트 해 보았습니다. 컴파일되었지만 프로젝트로 다시 전환하면됩니다. #include 지시어 순서는 중요합니다. 이 문제가 발생할 수있는 곳을 모르겠습니다. 아무도 내게 실마리를 줄 수있어 많은 도움이 될 것입니다. 미리 감사드립니다.

[해결] 나는 혼자서 문제를 해결했습니다. 그러나 나는 다른 사람들도 그것에 붙어 있을지도 모른다고 생각한다. 문제가 발생하는 이유는 test.cc에 다음

같았다

const int var_undef = -1; 
#define var_undef (-1) 

이 두 라인을 바꿀 경우 동안 그것은, 컴파일

#define var_undef (-1) 
const int var_undef = -1 

그것은 unqualified- 예상 오류와 함께 컴파일 내가 말했듯이 '-'토큰 앞의 id.

+2

'#include '는 본질적으로 복사 - 붙여 넣기 프로세스이므로 포함 순서가 중요 할 수 있습니다. 최소의 테스트 케이스를 작성하도록 노력하십시오. 그렇지 않으면 더 이상 도움을 드릴 수 없습니다. –

+0

헤더 파일 포함 순서는 중요하지 않습니다. –

+0

헤더가'# define' 매크로를 포함하거나'b.h '의 끝에 오류가있는 경우 *는 * 중요합니다. 아마도';'또는'}'가 누락 되었습니까? –

답변

3

물론 포함 순서가 중요합니다. include 지시문은 기본적으로 현재 번역 단위의 헤더 내용을 복사하여 붙여 넣습니다. b.h에 필요한 유형이 a.h에 정의되어있는 경우 a.h 앞에 b.h을 포함해야하며, 그렇지 않은 경우 a.hb.h에 포함하는 것이 더 좋습니다.

은 가정 : AB 전에 정의되어

//a.h 
struct A 
{ 
}; 

//b.h 
struct B : public A 
{ 
}; 

//main.cc 
#include "a.h" 
#include "b.h" 
int main() 
{ 
    return 0; 
} 

이 잘 컴파일합니다.번역 단위는 기본적으로 다음과 같습니다

struct A 
{ 
}; 
struct B : public A 
{ 
}; 
int main() 
{ 
    return 0; 
} 

포함의, 그러나, 당신이 순서를 반전하는 경우, 당신은 얻을 것이다 : 분명히 오류가

struct B : public A 
{ 
}; 
struct A 
{ 
}; 
int main() 
{ 
    return 0; 
} 

합니다.

그러나, 그 일을 가장 올바른 방법은 b.ha.h을 포함한다 : 다른 헤더에 대한 걱정없이 b.h 캔을 포함하고 싶어 누구든지

//b.h 
#include "a.h" 
struct B : public A 
{ 
}; 

그런 식으로.

관련 문제