2010-07-27 16 views
6

Ho un C++ file in questo modoin C++, cosa c'è di così speciale in "_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 

E con mia grande sorpresa, tutto il codice tra #ifndef e #endif viene semplicemente ignorato dal compilatore (giuro che non sto definendo _MOVE_H altrove), e ho tutti i tipi di errori sulle definizioni mancanti. Stavo pensando che ho fatto qualcosa di sbagliato, ma quando provo a usare un'altra chiave (come _MOVE_Ha, tutto è tornato alla normalità _MOVE_H significa qualcosa di speciale in C++?

Sto utilizzando Ubuntu 10.04, GCC 4.4.3 , se quello che conta

Grazie,

+1

potrebbe essere uno dei file di libreria che stai utilizzando usando quello per la sua protezione di inclusione? l'hai controllato? btw, normalmente lo prefisso con il nome del progetto in modo da evitare esattamente questo tipo di problema. – Naveen

+0

Un altro motivo per usare '#pragma once' invece di' # define' include guardie ... – Inverse

+4

@Inverse, '#pragma once' è un'estensione del compilatore e non è supportata da tutti i compilatori. Includere le guardie sono gli unici mezzi indipendenti dal compilatore sicuro per prevenire l'inclusione multipla. –

risposta

15

basta eseguire grep _MOVE_H in/usr/include/C++ sulla vostra macchina

per me:

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

Come regola generale, non utilizzare cose (davvero nulla) prefisso di _ o __. È riservato per uso interno. Utilizzare SOMETHING_MOVE_H (in genere nome dell'azienda, ...).

Suppongo che sia una nuova intestazione utilizzata per aggiungere la semantica di spostamento a C++ 0x.

+12

Per chiarire la regola del trattino basso, le seguenti cose sono riservate: qualsiasi nome * globale * con prefisso '_', qualsiasi nome di qualsiasi tipo preceduto da' __', e qualsiasi nome di qualsiasi tipo preceduto da '_' e che inizia con una lettera maiuscola. L'OP si trova in conflitto con la prima e la terza regola. –

+6

Qualsiasi nome che contenga un '__' è riservato. Non ha bisogno di essere prefisso. –

0

è un trucco per evitare che lo stesso file di intestazione viene incluso più di una volta il valore effettivo si #define non importa -.. fintanto che è definito solo in quel colpo di testa file, la convenzione è NAME_HEADER_FILE_H in maiuscolo

Vedi anche questo discusso on on #pragma once

+2

scusa, non è proprio questo il problema. il problema è che il mio file non è incluso affatto. – phunehehe

+0

Scusa non ho letto la Q abbastanza dettagliatamente –

5

Qualsiasi cosa che inizi con un trattino di sottolineatura, la lettera maiuscola viene riservata all'implementazione. (ad esempio _M). Penso che in generale tu voglia stare lontano dai principali underscore.

4

Credo che gcc abbia un file di inclusione chiamato move.h che include il sentinella _MOVE_H. Presumibilmente ti sei scontrato con questo. Utilizzare un identificatore diverso, preferibilmente uno che non inizi con un trattino basso. Inserisco un GUID nel mio, ma poi sono in realtà ossessivo :-)

+0

upvote per il guid! LOL! –