2009-12-16 5 views
6

En la sección 3.6.1.2 de ambos C++ estándar ediciones de 1998 y 2003,¿el estándar C++ prohíbe el prototipo void main()?

Una implementación no predefinir la función principal. Esta función no debe estar sobrecargada. Deberá tener un tipo de retorno de tipo int, pero de lo contrario su tipo está definido por la implementación.

No soy un hablante nativo de inglés. No estoy seguro de qué significa "sino lo contrario". ¿Para prohibir el otro tipo de devolución o para otorgar el derecho al escritor de compiladores de C++?

¿Cuál es la respuesta?

Respuesta

12

El Inglés se cita prohíbe declarar main para volver void. Está permitiendo la variación en los argumentos que entran, pero no en el tipo de devolución.

+0

Este es un tema favorito para atrapar a los participantes en los grupos de noticias. Sin embargo, ¿se puede lanzar el tipo de retorno de 'main' a' void'? –

+0

Lo siento, no sigo su pregunta. ¿Dónde estarías en posición de recibir el tipo de devolución principal? – bmargulies

+0

@bmargulies: ¿en otro programa C que tomó el resultado del primer programa como entrada? Aún así, pregunta extraña. –

7

Aaargh! Sí lo hace. El único tipo de devolución permitido por el estándar es int. Para citar de la sección 3.6.1:

Deberá tener un tipo de retorno de tipo int , pero por lo demás su tipo es definido por la implementación.

que significa que podría tener este aspecto:

int main(float f); 
int main(int x, int y); 

etc etc

2

El tipo contiene algo más que el tipo de devolución. Por lo tanto, el tipo de retorno debe ser int, pero usted es libre de considerar el argumento restante, es decir, es posible que, por ejemplo, elegir entre

int main() 

y

int main(int argc, char **argv) 
+0

o int main (int argc, char ** argv, char ** env) en linux –

+0

no requerido por el estándar C++ –

+0

Pero probablemente sea un requisito del compilador. –

0

En cuanto a los parámetros son preocupación, que permite a los

  1. int main()

  2. int main (int argc, char * argv [])

  3. int main (int argc, char * argv [], ENVR char * []) ​​

Pero según el tipo de retorno estándar debe ser int con fines de coherencia.

+0

El estándar C++ no exige el número 3. –

+0

El tercero está permitido pero no requerido por el Estándar C++, junto con muchas otras posibles firmas. El primer y segundo debe ser permitido por un compilador conforme. –

+0

¿Sería justo decir que el estándar permite que main tome cualquier conjunto de parámetros más allá de los dos primeros, pero el acceso a cualquier parámetro adicional será un comportamiento definido por la implementación (si la implementación lo define) o un comportamiento indefinido (si no lo hace) ?) – supercat

0

La intención es decir que los aspectos del tipo de la función main que no sean el tipo de retorno están definidos por la implementación.Eso significa que esta declaración es permitido por esta cláusula de la norma:

int main(int fred, char *bouncy); 

pero no ésta:

void main(int fred, char *bouncy); 

Su regreso tipo debe ser int, pero se permite la puesta en práctica de tener argumento diferente tipos.

1

La norma dice que el tipo de devolución debe ser int, pero que el resto del tipo depende de la implementación. Por ejemplo, podría hacer un compilador de C++ compatible con el estándar (pero no terriblemente útil) que se usara.

int main(int secondsSinceSystemStart, int myFavoriteNumber, char* aFunnyJoke) 

De Wikipedia:

En C y C++, el prototipo de la función de la función principal se parece a uno de los siguientes:

int main(void) 
int main(int argc, char **argv) 

Los parámetros argc, número del argumento, y argv, argumento vector, respectivamente dan el número y el valor de los argumentos de la línea de comando del programa. Los nombres de argc y argv pueden ser cualquier identificador válido, pero es una convención común usar estos nombres. Otros formatos dependientes de la plataforma también están permitidos por los estándares C y C++; por ejemplo, Unix (aunque no POSIX.1) y Microsoft Visual C++ tiene un tercer argumento que da el entorno del programa, de lo contrario puede acceder a través getenv en stdlib.h:

int main(int argc, char **argv, char **envp) 

Mac OS X y Darwin tienen un cuarto parámetro que contiene información del sistema operativo suministrado arbitraria, como la ruta al binario ejecución:

int main(int argc, char **argv, char **envp, char **apple) 
Cuestiones relacionadas