2012-08-27 35 views
9

Duplicar posible:
Standard way to define parameter-less function main() in CDefinición de main() en C

¿Puedo usar un definición declaración de la función main() en C que se parece a:

int main() {} 

Sí, vi que el estándar dice que hay onl y dos versiones compatibles garantizada:

int main(void) {} 

y

int main(int argc, char* argv[]) {} 

Pero ¿qué pasa con paratheses vacío? Sé que tiene otro significado que en C++ (en C, significa que no se conoce el número y los tipos de parámetros de esta función), pero vi realmente mucho código en C con esta declaración declaración definición de main.

Entonces, ¿quién está equivocado?

+2

La respuesta corta es "probablemente pueda salirse con la suya, porque su compilador es, probablemente, en un entorno muy indulgente, pero al mismo tiempo es probable que no debe intentar, porque es ligeramente incorrecto, daños portabilidad ligeramente , puede invocar las advertencias del compilador, y no trae ningún beneficio en absoluto ". – fennec

Respuesta

9

En C, hay una diferencia entre los declaracionesint main(); y int main(void); (el primero declara una función con un número no especificado de argumentos, y el último es en realidad llamado un proto ­ tipo). Sin embargo, en la función definición, ambos main() y main(void) definen una función que toma sin argumentos.

La otra firma, main(int, char**), es una forma alternativa. Las implementaciones que cumplen deben aceptar cualquier formulario, pero también pueden aceptar otras firmas definidas por la implementación para main(). Cualquier programa dado, por supuesto, solo puede contener una sola función llamada main.

+0

¿Desea mencionar las extensiones comunes de la sección J.5 en el estándar C99? _§J.5.1 Argumentos del entorno/ ¶1 En un entorno alojado, la función principal recibe un tercer argumento, 'char * envp []', que apunta a un conjunto de punteros terminados en nulo en char, cada uno de los cuales apunta a una cadena que proporciona información sobre el entorno para esta ejecución del programa (5.1.2.2.1) ._ –

+0

no es cierto su primera oración: 'main()' toma un número desconocido de argumentos; only 'main (void)' no toma argumentos – Federico

+2

Puede valer la pena señalar que mientras 'int main() {...}' como definición define efectivamente una función sin argumentos, sin embargo, no introduce por sí mismo un prototipo para 'principal'. Es decir. después de dicha definición, 'main' sigue siendo * declarado * como una función con parámetros no especificados. El bit "sin argumentos" afecta al cuerpo de 'main' solamente. – AnT

3

int main() y cualquier otra declaración de función como esta, toma un número desconocido de argumentos, por lo que esto es absolutamente incorrecto para la función principal. int main(void) no requiere argumentos.

char* argv[] es el arg ument v ector. Cuando escribe su argumento en la línea de comando, encontrará argumentos en este vector de cadenas. A veces también puede encontrar char **argv, pero es lo mismo. Los paréntesis [] están vacíos porque no sabemos cuántos argumentos provienen del usuario; existe el porte int argcarg ument c para este propósito: cuenta el número de argumentos están en argv (aunque la lista se termina con argv[argc] == NULL como un valor centinela también).

Lea también este link por la diferencia entre un genérico y foo()foo(void)

+1

Como una declaración, 'int main()' es problemático; en una definición de función (donde también se proporciona el cuerpo), dice que la función no toma argumentos, pero no proporciona una declaración prototipo de la función, por lo que si recursivamente llama a 'main()', no se evitará de hacer llamadas incorrectas. ¡Esto no suele ser un problema importante! –

+0

_Esto es absolutamente incorrecto para la función principal_ si llama a main explícitamente en algún lugar de su programa, que probablemente sea más que evitar que 'int main() {}' – AProgrammer

1

Si la implementación explícita documentos int main() (sin argumentos) como una firma válida, a continuación, a partir de C99 todo está bien (§ 5.1.2.2.1 ¶ 1, "... o de alguna otra manera definida por la implementación").

Si la aplicación no se documento que, a continuación, estrictamente hablando, el comportamiento no está definido (2), pero las probabilidades de que conducen a un comportamiento significativamente diferentes de int main(void) son, en mi experiencia, bajo bastante darned .

1
int main() {} 
    this is the standard prior to the c99 standard of main method. 

    int main(void){} 
    this is the standard coined by ANSI. 

    int main(int argc, char* argv[]) {}  
    This is the another version of main which provides the user to pass the command line 
    argument to the main method. 
+0

'int main (void)' es al menos 10 años mayor que tu declaras – AProgrammer

+0

no lo busqué en google pero de alguna manera lo leí somewr – kTiwari