usados tener seguidores populares pegar para muchos mas los likes hashtags copiar conseguir c

c - tener - ¿Por qué no usamos(void) en main?



hashtags para instagram para tener muchos likes 2018 (5)

La gente usa void main() /*empty parens ()*/

Me han enseñado a escribir void main(void)

¿Alguna idea de cuál es la diferencia?


Del estándar C99:

5.1.2.2.1 Inicio del programa

La función llamada al inicio del programa se llama main. La implementación no declara ningún prototipo para esta función. Se definirá con un tipo de retorno de int y sin parámetros:

int main(void) { /* ... */ }

o con dos parámetros (a los que se hace referencia aquí como argc y argv, aunque se pueden usar los nombres, ya que son locales para la función en la que se declaran):

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

o equivalente; o de alguna otra manera definida por la implementación.

Cuando main se define sin parámetros, ¿seguirán presente argc y argv en la pila?


Estos prototipos de main () son ambos no estándar.

La precisión en esa pregunta se puede encontrar en comp.lang.c faq: http://c-faq.com/decl/main.html

EDITAR : se cambió "incorrecto" a "no estándar" ya que la norma permite prototipos definidos por la implementación.


No estoy seguro de cuáles son los estándares hoy en día, pero en el C ANSI tradicional, el uso de paréntesis vacíos indica que la función puede tomar cualquier número de argumentos. Por otro lado, declarar un parámetro void indica que la función solo tiene cero argumentos . En este caso (y muchos otros), realmente no importa demasiado.

Sin embargo, si quieres ser estricto, probablemente sea mejor definir el parámetro void . Por supuesto, la función main también se puede definir como int main(int argc, const char* argv[]) , que es perfectamente válida, pero a menudo innecesaria si no le importan los argumentos.


No hay diferencia pero generalmente main debe devolver int. Algunos compiladores le darán una advertencia (al menos el compilador GNU - gcc):

$ cat x.c void main(void){} $ gcc x.c x.c: In function `main'': x.c:1: warning: return type of ''main'' is not `int''

Como se mencionó el prototipo de main es (según norma):

int main(int argc, const char* argv[])


main es una función, como otra función. Casi. De todos modos, al ser una función, es llamada por algún otro código (un código de inicio). Generalmente (leer: casi siempre) int main() es la correcta, pero de hecho, la correcta depende de la plataforma en la que la estés trabajando. Ya que, como se dijo, la función principal podría ser llamada por un código de inicio que no pasa ningún argumento, y que no espera un valor de retorno en un registro específico (de modo que el void main(void) sea ​​correcto).

El int main() es correcto ya que normalmente el código de inicio espera un valor de retorno y pasa dos argumentos. Al decir int main(void) estás diciendo que main no toma ningún argumento, eso es falso en la mayoría de los casos. Con () dices que hay argumentos (uno, dos, tres, no te importa), pero no estás interesado en ellos, por lo que no estás interesado en decir qué son y qué tipo son.

Como puedo ver en los códigos, el prototipo más utilizado para entornos "normales" (sin dispositivos incrustados u otros entornos "extraños" a los que se puede llamar main de manera diferente) es int main() cuando ignora el int argc, char **argv pasado. argumentos (GCC se queja porque estamos usando una versión para gcc adecuada para el medio ambiente; pruébela con una versión de GCC cruzada para uno de los entornos donde el código de inicio no pasa ningún argumento y no espera un valor de retorno)

editar

Sólo para ser amable con las personas escépticas; en el entorno donde se llama la función principal, con dos argumentos, los siguientes

int func() { return 0; } int func2(void) { return 1; } int main(void) { int a; a = func(a, a); /* A */ a = func2(a); /* B */ return 0; }

no dice ningún error para A, mientras que para B dice too many arguments to function ''func2'' , compilado con gcc -std=c99 -pedantic . Cambiar int main(void) en int main() no hace ninguna diferencia, y no hay advertencias.

En otros entornos (no puedo hacer pruebas prácticas ahora), void main(void) está bien, mientras que en este caso genera una advertencia. La advertencia no se debe solo al estándar, sino solo porque en el entorno en uso el prototipo de main no coincide. El estándar parece permitir cualquier otra "configuración" para main.

En el caso de OP, considerando el entorno "normal" (OS como GNU / Linux, por ejemplo), donde se pasan dos argumentos al principal, y se espera un valor de retorno, es preferible el int main() (los argumentos se insertan en la pila) por el código de inicio si dices int main(void) o no, así que int main() para mí tiene más sentido)

editar

Una nota más, siempre para personas escépticas. Como ya se demostró, B genera un error, ya que he dicho que es int func2(void) pero lo llamo pasar un argumento. Entonces, supongamos que podemos compilar el código de inicio y vincularlo, como cualquier otro código. En algún lugar, llamará al principal, de una manera como

retval = main(argc, argv);

Si usamos int main(void) , el compilador se detendrá, dando un error, ya que el código de inicio (en este entorno) está tratando de llamar a main con dos argumentos. Si usamos int main() no pasa nada y el código se compila correctamente.

Entonces, int main() es superior a int main(void) (en un entorno en el que esperamos dos argumentos posibles)

editar

Es más probable que la llamada sea como

retval = main(_argc, _argv, environ);

En muchos sistemas, pero esto no cambia el discurso anterior.

edición final

¿Alguien encontró que cuando se construye una herramienta de línea de comandos (es decir, en sistemas donde int argc, char ** tiene sentido) con int main(void) , el compilador / vinculador elegido vincula un código de inicio donde se llama al main sin argumentos (sea cual sea el las convenciones de llamada son), y en su lugar, al construir con int main(int argc, char **argv) el código de inicio es diferente y, de hecho, llama a main con esos dos argumentos (incluso si el main sí no los usa).