2016-05-19 14 views
7

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.

  1. Ich glaube, das ist in Ordnung, weil der Code, f() Anrufe muss nicht wissen, ob das tatsächliche Argument a als Konstante innerhalb f() behandelt wird. Dieses Detail ist privat für f(). Das ist nichts, worüber der Anrufcode besorgt ist. Was den Anrufer betrifft, kann sich nichts über int a, das für ihn sichtbar ist, ändern, während er in beiden Fällen f() aufruft. Habe ich recht?
  2. Ist es üblich, die tatsächlichen Argumente in den Funktionsdefinitionen als const int oder const char *const zu deklarieren, sondern sie in der Kopfzeile als nur int oder const char * zu deklarieren? Wenn nicht, empfehlen Sie diesen Weg? Um dieses zweite Ziel zu erreichen, listen Sie bitte die Vor- und Nachteile auf.
+4

Nein, es ist nicht wirklich in Ordnung. Dies sollte eine Warnung geben, da sich die Implementierung von der Deklaration unterscheidet. –

+1

@MichaelWalz: Weder Clang noch GCC warnen davor, selbst bei -std = c11 -pedantisch -Wall -Wextra. –

+1

@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. –

Antwort

8

Einige Software-Häuser auf Funktion Markierung bestehen Parameter const wenn möglich, da es eine Schule des Denkens ist, dass Ihre Funktion schlägt stabiler ist (und weniger anfällig für fehlerhafte Refactoring), wenn Sie das tun, da Sie nicht unbeabsichtigt verändern können ein Eingabeparameter.

Der C-Standard ermöglicht die Verwendung von Nicht-Parametern const in einer Funktionsdeklaration und const in der Definition.

Persönlich mache ich es nicht, weil ich meine Prototypen mag, um meinen Definitionen zu entsprechen. Ich könnte mir vorstellen, dass Sie auch Code-Analyse-Pakete verwirren könnten.

+0

Können Sie auf den Abschnitt im C-Standard verweisen, der nicht-'const' Parameter in Deklaration und' const' in Definition erlaubt? Die andere Antwort von Grzegorz Szpetkowski scheint dieser Behauptung zu widersprechen. Es wäre schön, wenn wir diesen Anspruch mit Bezug auf den C-Standard belegen könnten. –

+0

@LoneLearner: Ich habe meine Antwort gelöscht, da sie in diesem Punkt falsch war. Genauer gesagt, habe ich 6.7.6.3/15 verpasst, was im Wesentlichen besagt, dass das 'const'-Qualifikationsmerkmal zur Lösung der Kompatibilität weggelassen wurde. –

+0

@GrzegorzSzpetkowski Sie sollten Ihre Antwort wahrscheinlich wiederherstellen und sie aktualisieren, um sie korrekt zu machen. Ihre Antwort hatte wirklich nützliche Hinweise auf den C-Standard, der dazu beitragen würde, diese Frage mit ausreichenden Beweisen zu beantworten. –