2011-10-31 6 views
5

Sto usando Code :: Blocks 10.05 e mingw. Sembra che il compilatore non riconosca restringere il qualificatore e restituisca "error: expected ';', ',' or ')' prima di 'src'". Devo passare qualsiasi opzione del compilatore per compilarlo correttamente?limita l'errore di compilazione del qualificatore

int inet_pton4 (const char *restrict src, unsigned char *restrict dst) 

p/s: sembra MinGW non supporta inet_pton4, così ho cercato di integrare una versione open-source nel mio codice.

risposta

7

Se il compilatore non supporta la parola chiave restrict, togliere la parola chiave (a).

Viene utilizzato per indicare al compilatore che (lo sviluppatore) promette che i puntatori seguono determinate proprietà che coinvolgono l'aliasing e questo, a sua volta, consente al compilatore di eseguire determinate ottimizzazioni che altrimenti non sarebbero necessariamente sicure.

Se si omette quella parola chiave in un compilatore che la supporta, impedisce tali ottimizzazioni (lieve svantaggio).

Se si lascia fuori per compilatori che non lo fanno supporto che parola chiave, il lato negativo è pari a zero (dal momento che non supportano queste ottimizzazioni comunque) e il rialzo è notevole, come in "che verrà compilato per voi ":-)


(a) si consiglia per garantire la compilazione in modalità C99 prima. Mentre può essere vero che si sta utilizzando un vecchio gcc che non capisce restrict, è altrettanto possibile che non sta compilando in modalità C99, come ad esempio con -std=c99 (gcc documenti sembrano indicare che restrict è stato supportato ancora indietro alla versione 3.0).

Se, per qualche motivo, non è possibile attivare la modalità C99, penso che gcc abbia un'estensione che consente di utilizzare __restrict.

+1

Un modo semplice per estrarre la parola chiave (se necessario): utilizzare '-Drestrict' nella riga di comando. Il preprocessore lo prenderà per te e non dovrai modificare alcun codice. Rende facile tornare in futuro se si passa a un compilatore C99, pure. –

3

Dal restrict è nuovo a C99, e dal momento che, come sottolinea @paxdiablo, omettendo la parola chiave restrict non davvero male nulla, si può fare questo:

#if __STDC_VERSION__ < 199901L 
#define restrict /* nothing */ 
#endif 

mettere questo in un colpo di testa che è #include d da tutto ciò che è nel tuo progetto (o almeno da tutto ciò che utilizza restrict).

Questo dovrebbe consentire la compilazione del codice con qualsiasi compilatore C, indipendentemente dal fatto che supporti C99 o meno. Dovrebbe funzionare anche per un compilatore che non definisce __STDC_VERSION__.

Ma, dal momento che si sta usando MinGW, che usa gcc, utilizzando gcc --std=c99 dovrebbe anche risolvere il problema (come @paxdiablo punti anche fuori).

Puoi tranquillamente fare entrambe le cose. (E la soluzione #if è probabile che sia utile per gli altri.)