Qual è la differenza tra function () e function (void)?

16

Ho sentito che è una buona pratica scrivere funzioni che non ricevono nulla come parametro come questo:

int func(void);

Ma ho sentito che il modo giusto per esprimere è così:

int func();

Qual è la differenza tra queste due dichiarazioni di funzioni in C e C ++?

    
posta Grizzly 11.06.2015 - 17:11
fonte

2 risposte

7

C e C ++ sono diversi in questo senso.

Standard online C 2011

6.7.6.3 Function declarators (including prototypes)
...
10 The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.
...
14 An identifier list declares only the identifiers of the parameters of the function. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.145)

In breve, un elenco di parametri vuoto in una funzione dichiarazione indica che la funzione accetta un numero non specificato di parametri, mentre un elenco di parametri vuoto in una funzione definizione indica che la funzione accetta i parametri no .

T foo( void ); // declaration, foo takes no parameters
T bar();       // declaration, bar takes an *unspecified* number of parameters

T foo( void ) { ... } // definition, foo takes no parameters
T bar() { ... }       // definition, bar takes no parameters

Per quanto riguarda C, non dovresti mai usare un elenco identificativo vuoto in una definizione di dichiarazione o . Se una funzione non intende prendere alcun parametro, specificarlo utilizzando void nell'elenco dei parametri.

Standard C ++ online

8.3.5 Functions [dcl.fct]
...
4 The parameter-declaration-clause determines the arguments that can be specified, and their processing, when the function is called. [ Note: the parameter-declaration-clause is used to convert the arguments specified on the function call; see 5.2.2. — end note ] If the parameter-declaration-clause is empty, the function takes no arguments. A parameter list consisting of a single unnamed parameter of non-dependent type void is equivalent to an empty parameter list. Except for this special case, a parameter shall not have type cv void. If the parameter-declaration-clause terminates with an ellipsis or a function parameter pack (14.5.3), the number of arguments shall be equal to or greater than the number of parameters that do not have a default argument and are not function parameter packs. Where syntactically correct and where “...” is not part of an abstract-declarator, “, ...” is synonymous with “...”. [Example: the declaration
    int printf(const char*, ...);
declares a function that can be called with varying numbers and types of arguments.
    printf("hello world");
    printf("a=%d b=%d", a, b);
However, the first argument must be of a type that can be converted to a const char*end example ] [ Note: The standard header <cstdarg> contains a mechanism for accessing arguments passed using the ellipsis (see 5.2.2 and 18.10). — end note ]

Nel caso di C ++, un elenco di parametri vuoto in una dichiarazione o in una definizione indica che la funzione non accetta argomenti ed è equivalente all'utilizzo di un elenco di parametri di void .

    
risposta data 16.06.2015 - 22:35
fonte
31

In C, una funzione con una lista di parametri vuota () può prendere qualsiasi cosa per i suoi argomenti. Letteralmente niente. Di solito viene utilizzato per implementare una funzione che può richiedere un numero variabile di argomenti , anche se in questi giorni è preferibile utilizzare la più esplicita sintassi di ellissi (...) per queste funzioni.

In C, una funzione con la lista parametri (void) prende esplicitamente niente per i suoi argomenti. Ciò significa che il compilatore può effettivamente dirti che hai commesso un errore se provi a passare qualcosa.

In C ++, queste dichiarazioni di funzione sono equivalenti. Un elenco di parametri vuoti significa "nessun parametro" uguale a void .

    
risposta data 11.06.2015 - 17:20
fonte

Leggi altre domande sui tag