Siehe das folgende Programm.Ist es in Ordnung, das eigentliche Argument als `const int` zu definieren, sondern es als` int` in der Kopfzeile zu deklarieren?
#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 diesem Programm der Deklaration der Funktion f()
die Definition nicht genau übereinstimmt. Die Deklaration hat int a
als Parameter, aber die Definition hat const int a
als Parameter.
Hier sind meine Fragen zu diesem Programm.
- Ich glaube, das ist in Ordnung, weil der Code,
f()
Anrufe muss nicht wissen, ob das tatsächliche Argumenta
als Konstante innerhalbf()
behandelt wird. Dieses Detail ist privat fürf()
. Das ist nichts, worüber der Anrufcode besorgt ist. Was den Anrufer betrifft, kann sich nichts überint a
, das für ihn sichtbar ist, ändern, während er in beiden Fällenf()
aufruft. Habe ich recht? - Ist es üblich, die tatsächlichen Argumente in den Funktionsdefinitionen als
const int
oderconst char *const
zu deklarieren, sondern sie in der Kopfzeile als nurint
oderconst char *
zu deklarieren? Wenn nicht, empfehlen Sie diesen Weg? Um dieses zweite Ziel zu erreichen, listen Sie bitte die Vor- und Nachteile auf.
Nein, es ist nicht wirklich in Ordnung. Dies sollte eine Warnung geben, da sich die Implementierung von der Deklaration unterscheidet. –
@MichaelWalz: Weder Clang noch GCC warnen davor, selbst bei -std = c11 -pedantisch -Wall -Wextra. –
@MichaelWalz So weit ich verstehe, bedeuten 'f (const int a)' und 'f (int a)' dasselbe für den Aufrufer, dh in jedem Fall kann 'f()' nichts an 'a' ändern der Anrufer kann sehen. Außerdem habe ich mit 'gcc -Wall -Wextra -pedantic -std = c99 foo.c' kompiliert. Es gab keine Warnungen. –