2016-05-03 20 views
9

Esistono vecchie funzioni come index, rindex che sono state sostituite da strchr e strrchr.Come compilare il codice C su Linux/GCC senza che siano disponibili funzioni deprecate?

C'è un modo per configurare il compilatore o definisce così queste funzioni non sono disponibili?

Può causare confusione quando avvertimenti:

  • accidentalmente utilizzando index nome al di fuori del campo di applicazione per esempio - o peggio, non mettere in guardia e utilizzare la funzione in un modo che non è destinato.
  • Le versioni GCC precedenti (4.x) avvisano quando si utilizza -Wshadow se si dispone di una variabile denominata index.

See:


Note:

  • come @ Antti-Haapala dice, il mondiale il simbolo index non deve essere ridefinito in quanto le librerie potrebbero usarlo.
    Questa domanda riguarda il caso comune quando una variabile locale è chiamata index.
  • Al momento della scrittura, glibc non contrassegna queste funzioni con l'attributo deprecated, quindi gli avvisi relativi all'utilizzo di funzioni deprecate non hanno alcun effetto.
+0

ho mai osato porre questa domanda - abitualmente io uso un editor di testo per la ricerca di sostituire le variabili chiamato accidentalmente con nomi 'rischiosi' come 'index' ecc. con qualcosa' innocuo ', come 'indx' – user3078414

risposta

6

Utilizzare il compilatore in modalità ISO C. Lo standard C vieta che i programmi conformi vengano interrotti dalla presenza di identificatori che non sono parole riservate.

Ad esempio, utilizzare le bandiere -std=c99.

Esempio di programma:

#include <string.h> 

int main() 
{ 
    index("abc", 'x'); 
} 

Compilato con -std=c11 -Werror dà:

error: implicit declaration of function 'index' [-Werror=implicit-function-declaration]

2

Non è necessario ridefinire questi identificatori, poiché alcune librerie con cui si effettua il collegamento potrebbero comunque dipendere da esse esistenti.

+0

Right, ma si può definire una variabile chiamata' index' all'interno di una funzione, e utilizzare accidentalmente fuori campo. È il caso che sto chiedendo. – ideasman42

+0

@ ideasman42 quindi comunica al compilatore di avvisare della situazione. '-Wshadow' dovrebbe fare il trucco. –

+0

Nelle versioni più recenti di GCC (5.x +) 'index' non causa avvisi ombra. – ideasman42

0

Se ho capito bene, si desidera utilizzare index come un nome di variabile senza entrare in conflitto con la funzione index incluso nel <strings.h>.

In questo caso è possibile ignorare usando il preprocessore:

#include <stdio.h> 
#define index(s, c) deprecated_index(s, c) 
#include <strings.h> 

int index = 5; 

int main(void) 
{ 
    printf("%d\n", index); 
    return 0; 
} 

O ignorare index con strchr:

#include <stdio.h> 
#include <string.h> 
#include <strings.h> 

#define index(s, c) strchr(s, c) 

int main(void) 
{ 
    int index = 5; 
    char *ptr = index("text", 'x'); 

    printf("%s %d\n", ptr, index); 
    return 0; 
} 
+0

In OSX funziona con GCC (a livello di emissione di un solo avviso), ma non con il compilatore C LLVM: 'i.c: 11: 5: errore: ridefinizione di 'index' come diverso tipo di simbolo'. Esiste una direttiva per la ridefinizione delle funzioni predefinite, come una delle macro '# undef'? Ho consultato la documentazione, ma nulla di ciò che ho trovato sembra funzionare. – user3078414

+0

@ user3078414, non conosco questo tipo di 'undef', ma hai provato' #define index (s, c) deprecated_index (s, c) 'prima di' 'in LLVM? questo dovrebbe funzionare come macro sostitutiva –

+0

Questo è stato esattamente il mio punto di partenza, che non ha funzionato - in LLVM non sembra essere una macro, quindi ho iniziato a cercare dei modi per poterlo eventualmente annullare. Non riesco nemmeno a trovare dove è definito. – user3078414