Tipi di ritorno Const in C

Stavo leggendo alcuni esempi di codice, e hanno restituito un const int. Quando ho provato a compilare il codice degli esempi ho avuto degli errori riguardanti i tipi di ritorno in conflitto. Così ho iniziato a cercare, pensando che il const era il problema (quando l’ho rimosso, il codice funzionava bene, non solo lo compilava, ma funzionava come previsto). Ma non sono mai stato in grado di trovare informazioni relative a un tipo di ritorno const (l’ho fatto per strutture / parametri / ecc. Ecc., Ma non i tipi restituiti). Così ho provato a scrivere un pezzo di codice per mostrare semplicemente cosa può fare const. Mi sono inventato questo:

#include  int main() { printf("%i", method()); } const int method() { return 5; } 

E quando compilo questo, ottengo:

 $ gcc first.c first.c:7: error: conflicting types for 'method' first.c:4: note: previous implicit declaration of 'method' was here 

Tuttavia, ogni volta che rimuovo il const, come previsto, stampa semplicemente un 5, continua con la vita. Quindi, qualcuno può dirmi cosa const dovrebbe significare quando usato come un tipo di ritorno. Grazie.

L’aggiunta del prototipo di method () prima di chiamarla risolverà l’errore.

 const int method(); int main() { printf("%i", method()); } 

 Line 7: error: conflicting types for 'method' 

Questo errore ci dice che method() stato creato dal compilatore (perché non lo trovava) con un tipo di ritorno diverso da const int (probabilmente int).

 Line 4: error: previous implicit declaration of 'method' was here 

Questo altro errore ci dice che in effetti il ​​compilatore ha creato la sua versione del method .

const non ha senso per i valori di ritorno perché i valori di ritorno sono in ogni caso rvalori e non possono essere modificati. L’errore che si ottiene deriva dal fatto che si utilizza una funzione prima che sia stata dichiarata in modo che si presuma implicitamente di restituire int , non const int ma, successivamente, quando il metodo viene effettivamente definito, il tipo restituito non corrisponde all’assunzione originale . Si otterrebbe esattamente lo stesso errore se fosse, per esempio, di restituire double invece di int .

Per esempio:

 #include  int main() { printf("%i", method()); } double method() { return 5; } 

genera:

 $ gcc -std=c99 -Wall -Wextra -pedantic impl.c impl.c: In function 'main': impl.c:4: warning: implicit declaration of function 'method' impl.c: At top level: impl.c:7: error: conflicting types for 'method' impl.c:4: note: previous implicit declaration of 'method' was here 

Scopri quanto è utile triggersre i livelli di avviso!

C fa ipotesi sul tipo di ritorno di una funzione quando la si usa prima di aver detto a C abbastanza sulla funzione: nome, tipo di ritorno, costanza e argomenti. Se queste ipotesi sono sbagliate, ottieni l’errore. In questo caso, sono sbagliati. Utilizzare un prototipo o spostare la funzione sopra la chiamata.

Oh, e riguardo CONST-ness: questo significa che il valore di una funzione sarà lo stesso se lo si chiama di nuovo con gli stessi parametri, e che non dovrebbero esserci effetti collaterali (importanti). Questo è utile per l’ottimizzazione, e fa anche un documentario affermando che il compilatore può applicare i parametri relativi. Una funzione promette di non alterare una costante e il compilatore può prevenirlo.

Il codice che hai postato dovrebbe darti un identificatore indefinito: method per lo meno. È necessaria una dichiarazione nell’ambito prima che sia ansible chiamare la funzione. Migliore utilizzo:

 #include  const int method() { return 5; } int main() { printf("%i", method()); } 

Una definizione è anche una dichiarazione. Quindi, questo dovrebbe correggere il tuo errore.

main vede un uso di method() senza un prototipo, quindi assume che restituisca int. Quindi lo dichiarerai come restituendo const int . Sposta la dichiarazione di method() prima di main , o metti un prototipo prima di main .