2010-10-18 27 views

Respuesta

42

3.6.1/1 - "Un programa deberá contener una función global llamada principal, que es el comienzo del programa designado Es definido por la implementación si un programa en una. se requiere entorno independiente para definir una función principal [Nota: en un entorno independiente , puesta en marcha y terminación es definido por la implementación; de inicio contiene la ejecución de constructores de objetos de n. amespace ámbito con duración de almacenamiento estática; terminación contiene la ejecución de destructores para objetos con una duración de almacenamiento estática. -finalizar nota]

Su ejemplo tiene 'main' (previsto como el punto de entrada del programa) como una función de espacio de nombres y, por lo tanto, su código está mal formado. Esto no significa que una función 'principal' no pueda definirse como usted lo hizo. Simplemente significa que se requiere una definición del alcance del espacio de nombres global de 'main' de acuerdo con la firma definida estándar para un programa independiente . programa alojado

+0

ah, ya veo, gracias! – shuttle87

4

El enlazador es necesario para organizar el inicio de la ejecución del programa en una función global llamada "principal". El objetivo de crear sus propios espacios de nombres, como lo ha hecho, es evitar poner cosas en el espacio de nombres global para que no sean recogidas accidentalmente por otro código o el enlazador. Estás diciendo explícitamente "Llamo a esta función principal, pero eso solo es significativo en el contexto de somenamespace; si no conoces el espacio de los segundos, no lo encontrarás ni podrás usarlo".

En términos de implementación, el nombre destrozado de su símbolo principal ha sido cambiado del nombre esperado debido al espacio de nombres, por lo que el vinculador simplemente no encuentra la entrada de la tabla de símbolos que necesita.

22

El vinculador está buscando ::main, no ::somenamespace::main. El main que se llama al inicio del programa debe estar en el espacio de nombres global.

@Chubsdad tiene pointed you at the relevant language in the standard that states this. Pero el estándar ahora está escrito en un extraño 'standardese' que se parece mucho al jerga legal. Sentí que una simple declaración en inglés de lo que estaba pasando podría ser mejor.

Nota: Existe una razón por la cual el estándar está escrito de esta manera. En el estándar, usted quiere que cada término que use tenga un significado muy preciso y bien definido, y no quiere que ese significado varíe dependiendo del contexto, ya que hace que el estándar sea mucho más difícil de interpretar. Esto es en realidad muy similar a la razón por la cual la jerga legal se ve como lo hace.

+2

Excepto que los abogados legales hacen muchísimo copiar y pegar y hacer referencia oscura ... standardese tiende a expresar ideas algo nuevas, y el estándar es bastante autónomo. – Potatoswatter

+2

Estoy de acuerdo con esta respuesta. No cite el estándar a menos que sea un área oscura del idioma, lo solicitaron específicamente, o necesita respaldar sus reclamos. Se vuelve tedioso. – GManNickG

+0

@Potatoswatter - Sí, es cierto. Legalese, en mi humilde opinión, en realidad es mucho más difícil de interpretar porque se basa implícitamente en cientos de años de historia legal. El estándar, como dices, es bastante autónomo.Tiene secciones en las que todos los términos precisos que utiliza están cuidadosamente definidos. – Omnifarious

Cuestiones relacionadas