2010-10-18 15 views
24

Perché questo non viene compilato? Il linker non riesce a trovare main, ma perché è così?main nel namespace

namespace somenamespace{ 

int main(void){ 
return 0; 
} 

} 

risposta

42

3.6.1/1 - "Un programma contengono una funzione globale chiamato principale, che è l'inizio designato del programma è definito dall'implementazione se un programma in un. autoportante ambiente deve definire una funzione principale [Nota: in un ambiente indipendente, avvio e terminazione dipende dall'implementazione; avvio contiene l'esecuzione di costruttori di oggetti di n. ambito con durata dell'archiviazione statica; La terminazione contiene l'esecuzione dei distruttori per oggetti con durata di archiviazione statica . -end note]

L'esempio ha 'main' (inteso come punto di ingresso del programma) come funzione namespace e quindi il codice è mal formato. Ciò non significa che una funzione 'main' non possa essere definita come hai fatto tu. Significa semplicemente che è necessaria una definizione dell'ambito dello spazio dei nomi globale di "main" in conformità con la firma definita standard per un programma indipendente da . programma ospitato

+0

ah capisco, grazie! – shuttle87

4

Il linker è necessario per far avviare l'esecuzione del programma in una funzione globale denominata "main". L'intero punto di benig in grado di creare i propri spazi dei nomi - come hai fatto tu - è di evitare di mettere le cose nello spazio dei nomi globale in modo che non vengano accidentalmente captate da altro codice o dal linker. Stai dicendo esplicitamente "Sto chiamando questa funzione principale, ma questo è significativo solo nel contesto di somenamespace - se non conosci lo somenamespace non lo troverai o non sarai in grado di usarlo".

Per quanto riguarda l'implementazione, il nome del simbolo principale è stato modificato dal nome previsto a causa dello spazio dei nomi, quindi il linker non trova la voce della tabella dei simboli di cui ha bisogno.

22

Il linker sta cercando ::main, non ::somenamespace::main. Lo main chiamato all'avvio del programma deve trovarsi nello spazio dei nomi globale.

@Chubsdad ha pointed you at the relevant language in the standard that states this. Ma lo standard è ora scritto in un bizzarro "standardese" che ha molta somiglianza con il legalese. Ho sentito una semplice dichiarazione inglese di ciò che stava accadendo potrebbe essere migliore.

Nota: C'è una ragione per cui lo standard è scritto in questo modo. Nello standard si desidera che ogni termine che si utilizza abbia un significato ben preciso e ben definito e non si desidera che tale significato vari in base al contesto, poiché rende lo standard molto più difficile da interpretare. Questo è in realtà molto simile alla ragione per cui il legalese ha lo stesso aspetto.

+2

Fatta eccezione per gli avvocati legali che fanno un sacco di copia-incolla e riferimenti oscuri ... lo standard tende ad esprimere idee un po 'nuove, e lo standard è piuttosto ben contenuto. – Potatoswatter

+2

Sono d'accordo con questa risposta. Non citare lo standard a meno che non si tratti di un'area oscura della lingua, che sia stata specificatamente richiesta o che tu debba supportare le tue affermazioni. Diventa faticoso. – GManNickG

+0

@Potatoswatter - Sì, è vero. Il legalese, IMHO, è in realtà molto più difficile da interpretare perché si basa implicitamente su centinaia di anni di storia legale. Lo standard, come lei afferma, è piuttosto autonomo.Ha sezioni in cui tutti i termini precisi che usa sono accuratamente definiti. – Omnifarious

Problemi correlati