Vedere il seguente programma.Va bene definire l'argomento attuale come `const int` ma dichiararlo come solo` int` nell'intestazione?
#include <stdio.h>
void f(int a);
int main()
{
f(10);
return 0;
}
void f(const int a)
{
/* a = 20; */ /* Want to avoid accidental modification of a. */
printf("%d\n", a);
}
In questo programma la dichiarazione della funzione f()
non corrisponde esattamente alla definizione. La dichiarazione ha int a
come parametro ma la definizione ha come parametro const int a
.
Ecco le mie domande su questo programma.
- Credo che questo sia bene perché, il codice che chiama
f()
non ha bisogno di sapere se l'argomento attualea
è trattato come costante all'internof()
. Questo frammento di dettaglio è privato perf()
. Questa non è la preoccupazione del codice chiamante. Per quanto riguarda il chiamante, nulla diint a
visibile è in grado di cambiare mentre si chiamaf()
in entrambi i casi. Ho ragione? - È comune dichiarare gli argomenti effettivi nelle definizioni di funzione come
const int
oconst char *const
ma dichiararli nell'intestazione come soloint
oconst char *
? Se no, mi consigliate in questo modo? Per mantenere questo secondo obiettivo della domanda, si prega di elencare i pro e i contro di questo.
No, non è proprio ok. questo dovrebbe dare un avvertimento, perché l'implementazione è diversa dalla dichiarazione. –
@MichaelWalz: Né Clang né GCC danno un avvertimento a riguardo, anche a '-std = c11 -pedantic -Wall -Wextra'. –
@MichaelWalz Per quanto ho capito, 'f (const int a)' e 'f (int a)' significano la stessa cosa per il chiamante, cioè in entrambi i casi 'f()' non può alterare nulla su 'a' che il chiamante può vedere. Inoltre, ho compilato 'gcc -Wall -Wextra -pedantic -std = c99 foo.c'. Non c'erano avvertimenti. –