Per quanto ne so, gli standard sono principalmente per la portabilità del codice tra i compilatori, ma sono curioso di sapere se alcune cose nello standard che sono considerate come avvertimenti quando non vengono seguite possono far fallire effettivamente il software, o se il codice è scritto che non è conforme allo standard e compila / esegue dove è necessario, può essere lasciato inutilizzato di solito?
Ecco un esempio del libro Deep C Secrets (le spiegazioni sul perché ciò avvenga saranno al di sotto di tutto). Non sono sicuro che questo problema specifico potrebbe causare il caos possibile (sebbene sia un cast implicito per tipi altrimenti incompatibili), ma è l'esempio che mi ha posto la domanda.
void foo (const char ** p) {}
int main (int argc, char ** argv)
{
foo(argv); //compiler says "line 5: warning: argument is incompatible with prototype"
return 0;
}
Per il gusto dell'argomento, supponiamo che lo sviluppatore dica "no big deal" e decida di non correggere l'avvertenza dal momento che il codice viene compilato (sul compilatore). Se questo, ipoteticamente, potrebbe causare la rottura del software, perché non si tratta di un errore? Oppure un avviso viene semplicemente richiamato perché alcuni altri compilatori potrebbero non supportare l'assegnazione di const char ** = char **
?
perché succede (o semplicemente controlla le FAQ C) :
A pagina 92 di questo standard, il terzo vincolo possibile sotto (1) per compiti semplici è quello:
- entrambi gli operandi sono puntatori a tipi compatibili (con o senza qualifiche)
- il tipo puntato dall'operando di sinistra ha tutti i qualificatori (o più) rispetto al tipo puntato dall'operando di destra
In questo caso, char **
e const char **
sono entrambi puntatori a diversi tipi non qualificati (puntatori, da uno a const char *
e, dall'altro a char *
).