2010-07-27 13 views
6

Mam C++ plik jak tow C++, co jest takiego specjalnego w "_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 

I ku mojemu zaskoczeniu, cały kod pomiędzy #ifndef i #endif jest po prostu ignorowane przez kompilator (przysięgam, że nie jestem definiowania _MOVE_H nigdzie indziej), i mam wszelkiego rodzaju błędy dotyczące brakujących definicji. Myślałem, że zrobiłem coś nie tak, ale kiedy próbuję użyć innego klucza (jak _MOVE_Ha, wszystko wróciło do normy. Czy _MOVE_H oznacza coś specjalnego w C++?

Używam Ubuntu 10.04, GCC 4.4.3 jeśli to się liczy

Dzięki

+1

może być jednym z plików biblioteki, które są w tym przy użyciu tego dla jego strażnika włączenia? sprawdziłeś to? btw, zwykle poprzedzam go nazwą projektu, aby uniknąć właśnie tego rodzaju problemu. – Naveen

+0

Innym powodem użycia '#pragma raz' zamiast' # define' jest ochrona ... – Inverse

+4

@Inverse, '#pragma once' jest rozszerzeniem kompilatora i nie jest obsługiwane przez wszystkie kompilatory. Dołączenie strażników jest jedynym bezpiecznym, niezależnym od kompilatora sposobem zapobiegania wielokrotnemu włączaniu. –

Odpowiedz

15

wystarczy uruchomić grep _MOVE_H w/usr/include/C++ na komputerze

dla mnie:

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

Jako zasada, nie używaj rzeczy (naprawdę wszystko) prefiksem przez _ lub __. Jest zarezerwowany do użytku wewnętrznego. Użyj SOMETHING_MOVE_H (zazwyczaj nazwa firmy, ...).

Domyślam się, że jest to nowy nagłówek używany do dodawania semantycznego przeniesienia do C++ 0x.

+12

Aby wyjaśnić regułę podkreślenia, następujące rzeczy są zarezerwowane: dowolna * globalna * nazwa z prefiksem "_", dowolna nazwa dowolnego przedrostka poprzedzona przez '__' i dowolna nazwa dowolny rodzaj poprzedzony przez '_' i rozpoczynający się od dużej litery. PO działa wbrew pierwszym i trzecim zasadom. –

+6

Wszystkie nazwy zawierające '__' są zarezerwowane. Nie musi być poprzedzony prefiksem. –

0

to podstęp, aby zapobiec tego samego pliku nagłówka jest dołączony więcej niż jeden raz rzeczywista wartość ty #define nie ma znaczenia -.. tak długo, jak to określono tylko w tym nagłówku plik, konwencja to NAME_HEADER_FILE_H w dużych literach

Zobacz także ten discussi na #pragma once

+2

Przepraszam, to nie jest problem. Problem polega na tym, że mój plik nie jest w ogóle uwzględniany. – phunehehe

+0

Przykro nam, że nie przeczytano litery Q z wystarczającą szczegółowością. –

5

Wszystko zaczynające się od podkreślenia, a następnie duża litera jest zarezerwowana dla implementacji. (tj. _M). Myślę, że ogólnie chcesz trzymać się z dala od wiodących podkreśleń.

4
Wierzę, że gcc ma plik włączający o nazwie move.h, który zawiera wartownik _MOVE_H. Prawdopodobnie zderzyłeś się z tym. Użyj innego identyfikatora, najlepiej takiego, który nie zaczyna się od podkreślenia. Umieściłem GUID w moim, ale jestem naprawdę obsesyjne :-)
+0

awans do przewodnika! LOL! –