sirve significa que para definicion c main void

significa - Diferencia entre int main() e int main(void)?



void main c++ para sirve (8)

El prototipo de función que tiene Type foo(void) es absolutamente igual que Type foo() , no hay diferencia entre los dos. Former puede usarse para legibilidad.

Al igual que con main - tomando argumentos o no, el programa aún puede acceder a la información de línea de comandos a través de otros medios como __argv , __argc , GetCommandLine u otros símbolos específicos de plataforma / compilador.

Qué significa lo siguiente :

int main(void) {...}

VS

int main() {...}

?

Creo que int main() {...} significa que main no recibe ningún parámetro (desde la línea de comandos), sin embargo:

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

hace.

Pero, ¿qué significa int main(void) {...} ? ¿Qué significa el vacío ?

He buscado here pero de alguna manera es una pregunta diferente.


En C ++ tener una función foo(void) y foo() es lo mismo. Sin embargo, en C es diferente: foo(void) es una función que no tiene argumentos, mientras que foo() es una función con argumentos no especificados.


En C ++, no hay diferencia entre los dos, e int main() es una firma legal y un tipo de devolución para main .


En C ++, no hay diferencia, ambos son lo mismo.

Ambas definiciones también funcionan en C, pero la segunda definición con vacío se considera técnicamente mejor ya que especifica claramente que la principal solo puede invocarse sin ningún parámetro. En C, si una firma de función no especifica ningún argumento, significa que la función puede invocarse con cualquier cantidad de parámetros o sin ningún parámetro. Por ejemplo, intente compilar y ejecutar los siguientes dos programas C (recuerde guardar sus archivos como .c).


En C ++, no hay diferencia.

En C, la diferencia es cuestionable. A algunos les encanta argumentar que la última versión (la que no tiene void ) es técnicamente una extensión de implementación común y no garantiza que funcione según el estándar debido a la redacción en el estándar. Sin embargo, el estándar establece claramente que en una definición de función un conjunto vacío de parámetros tiene un comportamiento bien definido: que la función no toma ningún parámetro. Por lo tanto, tal definición para main coincide con la siguiente descripción en la norma:

[Main] se definirá con un tipo de retorno de int y sin parámetros.

Sin embargo, hay una diferencia notable entre los dos: a saber, la versión sin void no proporciona un prototipo correcto para la función:

// this is OK. int main() { if (0) main(42); } // this requires a diagnostic to be shown during compiling int main(void) { if (0) main(42); }

Ah, y solo para estar completo: el void tiene el siguiente significado en todos los declaradores de funciones:

(6.7.6.3p10) El caso especial de un parámetro sin nombre de tipo void como el único elemento en la lista especifica que la función no tiene parámetros.


En C, en un prototipo (no en C ++) una lista de argumentos vacía significa que la función podría tomar cualquier argumento (en la definición de una función, significa que no hay argumentos). En C ++, una lista de parámetros vacía significa que no hay argumentos. En C, para no obtener argumentos, debe usar void . Vea this pregunta para una mejor explicación.


En primer lugar, existe una diferencia de lo que está permitido para sistemas alojados y sistemas independientes, como se muestra aquí .

Para sistemas alojados, 5.1.2.2.1 se aplica el 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)

... (más texto sigue con respecto a los estilos argv / argc etc).

La parte interesante es "sin parámetros". int main() e int main (void) son actualmente equivalentes, ya que ambos son declaradores de función y no tienen parámetros. Se aplica lo siguiente (6.7.6.3):

10 El caso especial de un parámetro sin nombre de tipo void como el único elemento en la lista especifica que la función no tiene parámetros.

/ - /

14 Una lista de identificadores declara solo los identificadores de los parámetros de la función. Una lista vacía en un declarador de función que es parte de una definición de esa función especifica que la función no tiene parámetros. La lista vacía en un declarador de función que no es parte de una definición de esa función especifica que no se proporciona información sobre el número o los tipos de los parámetros.145)

Énfasis mío, el texto en negrita es lo que se aplica a int main() . También hay una nota 145) al final del texto, que dice "Ver '''' las direcciones futuras del lenguaje '''' (6.11.6)":

6.11.6 Declaradores de funciones

El uso de declaradores de función con paréntesis vacíos (no declaradores de tipo de parámetro de formato prototipo) es una característica obsoleta.

Y aquí está la diferencia. Al ser un declarador de función, int main() es un estilo incorrecto debido a lo anterior, ya que no se garantiza que funcione en la próxima versión del estándar C. Está marcado como una característica obsoleta en C11.

Por lo tanto, siempre debe usar int main (void) en un sistema alojado y nunca int main() , incluso si las dos formas son, por ahora, equivalentes.

En C ++ ambas formas son completamente equivalentes, pero allí int main() es el estilo preferido por razones cosméticas subjetivas (Bjarne Stroustrup lo dice ... lo cual es probablemente una razón bastante mala para explicar por qué haces algo de una manera particular).


Sé que el hilo es viejo, pero esta pregunta me molestaba hace unos años, así que quería sacar mi medio centavo (si es que eso).

Siempre trato a las funciones C como si tuvieran una cantidad fija de argumentos independientemente del contexto, a menos que usen va_args. Es decir, confío en que SIEMPRE tendrá el prototipo SIEMPRE

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

incluso si no se pasan argumentos, la función tiene estos argumentos en la pila porque la función principal no tiene sobrecarga de funciones.

C tiene la capacidad de tener una sobrecarga primitiva simplemente pretendiendo que el argumento no está allí. En cuyo caso, el argumento aún se pasa y está en la pila, pero nunca se accede a él, por lo que simplemente reduce el tamaño del código fuente.

Decir int main () simplemente significa que sé que la función puede tener parámetros, pero no los estoy usando, así que escribo int main ().

Al decir int main (void) dice que main ciertamente NO tiene argumentos, e implica que hay dos prototipos de funciones diferentes:

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

Como C no tiene una sobrecarga de funciones, esto me resulta algo confuso y desconfío del código que tiene main (void). No lo haría si main NUNCA tomara ningún parámetro, en cuyo caso main (vacío) estaría completamente bien.

NOTA: En algunas implementaciones, hay más parámetros en main que argc y argv, como env, pero esto no me molesta porque sé que no digo explícitamente que esos son los dos únicos parámetros, pero esos son los parámetros mínimos y está bien tener más, pero no menos. Esto está en contraste con decir francamente int main (void) que me grita ya que ESTA FUNCIÓN NO TIENE PARÁMETROS, lo que no es cierto, ya que lo hace, simplemente se omiten.

Aquí está mi código base:

/* sample.c - build into sample. */ #include <stdio.h> int main(void) { int _argc = *((int *)2686800); char ***_pargv = (char ***)2686804; int i; for (i = 1; i < _argc; ++i) { printf("%s ", (*_pargv)[i]); } return 0; }

./muestra claramente tengo argumentos

La función claramente tiene argumentos que se le pasan, a pesar de salir del camino para decir explícitamente que no escribe el vacío en el prototipo de la función.

Como eq- dice arriba:

(6.7.6.3p10) El caso especial de un parámetro sin nombre de tipo void como el único elemento en la lista especifica que la función no tiene parámetros.

Por lo tanto, decir que la función ha sido anulada como argumento, pero tener argumentos en la pila es una contradicción.

Mi punto es que los argumentos siguen ahí, por lo que afirmar explícitamente que main está vacío de argumentos es deshonesto. La forma más honesta sería decir int main (), que no dice nada sobre cuántos parámetros tiene, solo cuántos parámetros le importan.

NOTA 2: _argc, _pargv dependen del sistema; para encontrar sus valores, debe encontrarlos ejecutando este programa:

/* findargs.c */ #include <stdio.h> int main(int argc, char **argv) { printf("address of argc is %u./n", &argc); printf("address of argv is %u./n", &argv); return 0; }

Estos valores deben seguir siendo correctos para su sistema específico.