2010-07-27 2 views
6

나는 (내가 다른 곳 _MOVE_H을 정의하고 있지 않다 맹세) #ifndef#endif 사이의 모든 코드는 단순히 컴파일러에 의해 무시하는 C이(C++), "_MOVE_H"의 특별한 점은 무엇입니까?

#ifndef _MOVE_H 
#define _MOVE_H 

class Move { 
    int x, y; 
public: 
    Move(int initX = 0, int initY = 0) : x(initX), y(initY) {} 
    int getX() { return x; } 
    void setX(int newX) { x = newX; } 
    int getY() { return y; } 
    void setY(int newY) { y = newY; } 
}; 

#endif 

처럼 나의 놀람에 파일 ++, 그리고 내가 가진 누락 된 정의에 대한 모든 종류의 오류. 내가 뭔가 잘못했다고 생각했는데 다른 키 (예 : _MOVE_Ha)를 사용하려고하면 모든 것이 정상으로 돌아갑니다.

저는 Ubuntu 10.04, GCC 4.4.3을 실행하고 있습니다. 그 중요한 경우

감사합니다,

+1

당신은 포함 경비원을 위해 그것을 포함하는 라이브러리 파일 중 하나가 될 수 있습니까? 그걸 확인 했니? btw, 나는 보통 문제의이 유형을 피하기 위해 일반적으로 프로젝트 이름 앞에 붙인다. – Naveen

+0

'# define '대신'#pragma once'를 사용하는 또 다른 이유는 ... – Inverse

+4

@Inverse,'#pragma once'는 컴파일러 확장이며 모든 컴파일러에서 지원하지 않습니다. Include guards는 다중 포함을 방지하는 유일한 컴파일러 독립적 인 수단입니다. –

답변

15

는 그렙 _MOVE_H을 실행 _ 또는 __. 내부 용으로 예약되어 있습니다. SOMETHING_MOVE_H (일반적으로 회사 이름, ...)을 사용하십시오.

C++ 0x에 이동 의미를 추가하는 데 사용되는 새 헤더 인 것 같습니다.

+12

밑줄 규칙을 명확히하기 위해 다음과 같은 것들이 예약되어 있습니다 : * 접두사가'_' 인 모든 * 글로벌 * 이름, 접두어가'__' 인 모든 정렬 이름, 그리고 모든 이름 '_ '로 시작하고 대문자로 시작하는 모든 정렬. OP는 첫 번째와 세 번째 규칙에 위배됩니다. –

+6

'__'을 (를) 포함하는 이름은 모두 예약되어 있습니다. 접두사가 필요하지 않습니다. guid에 대한 –

0

그것은 두 번 이상 포함되지 같은 헤더 파일을 방지하기 위해 트릭의 실제 값 당신 #DEFINE는 문제가되지 않습니다 -.. 그것은 단지 그 헤더에 정의되어 너무 오래로 파일, 관습은 NAME_HEADER_FILE_H (대문자)입니다.

참고 사항 on on #pragma once

+2

죄송합니다. 실제로 문제가 아닙니다. 문제는 내 파일이 전혀 포함되지 않았다는 것입니다. – phunehehe

+0

미안 Q를 자세히 읽지 못했습니다 –

5

밑줄로 시작하는 모든 것은 대문자가 구현에 예약되어 있습니다. (즉, _M). 제 생각에 일반적으로 밑줄을 긋고 싶지는 않습니다. 엄지 손가락의 규칙으로

c++/4.5.0/bits/move.h:#ifndef _MOVE_H 

, 물건을 사용하지 않는 (정말 아무것도) 접두어 /는 USR// C++ 나에게 컴퓨터

에 포함에

4

gcc에는 sentinel _MOVE_H가 포함 된 move.h라는 포함 파일이 있다고 생각합니다. 아마도 당신은 이것과 충돌했을 것입니다. 다른 식별자를 사용하십시오. 하나는 밑줄로 시작하지 않는 것이 좋습니다. 내 GUID를 넣어,하지만 난 정말 강박 :-)

+0

upvote! 웃음! –