2016-05-19 18 views
7

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.

  1. Credo che questo sia bene perché, il codice che chiama f() non ha bisogno di sapere se l'argomento attuale a è trattato come costante all'interno f(). Questo frammento di dettaglio è privato per f(). Questa non è la preoccupazione del codice chiamante. Per quanto riguarda il chiamante, nulla di int a visibile è in grado di cambiare mentre si chiama f() in entrambi i casi. Ho ragione?
  2. È comune dichiarare gli argomenti effettivi nelle definizioni di funzione come const int o const char *const ma dichiararli nell'intestazione come solo int o const 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.
+4

No, non è proprio ok. questo dovrebbe dare un avvertimento, perché l'implementazione è diversa dalla dichiarazione. –

+1

@MichaelWalz: Né Clang né GCC danno un avvertimento a riguardo, anche a '-std = c11 -pedantic -Wall -Wextra'. –

+1

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

risposta

8

Alcuni software case insistono sulla funzione di marcatura parametri const, se possibile, in quanto v'è una scuola di pensiero che suggerisce la vostra funzione è più stabile (e meno vulnerabile a refactoring errante) se si fa questo dal momento che non si può modificare inavvertitamente un parametro di input.

Lo standard C consente di utilizzare parametri non const in una dichiarazione di funzione e const nella definizione.

Personalmente non lo faccio perché mi piacciono i miei prototipi in modo che corrispondano alle mie definizioni. Immagino che potresti confondere anche i pacchetti di analisi del codice.

+0

Puoi puntare alla sezione nello standard C che consente il parametro non-'constst' nella dichiarazione e' const' nella definizione? L'altra risposta di Grzegorz Szpetkowski sembra contraddire questa affermazione. Sarebbe bello se potessimo dimostrare questa affermazione con riferimenti allo standard C. –

+0

@LoneLearner: ho cancellato la mia risposta, dal momento che era sbagliato su quell'aspetto. Più specificamente, ho perso il 6.7.6.3/15, che in sostanza dice che il qualificatore 'const' è stato eliminato per la risoluzione della compatibilità. –

+0

@GrzegorzSzpetkowski Probabilmente dovresti annullare l'eliminazione della risposta e aggiornarla per renderla corretta. La tua risposta ha avuto riferimenti molto utili allo standard C che avrebbero aiutato a rispondere a questa domanda con prove sufficienti. –

Problemi correlati