Ho una semplice domanda su GLib.Perché GLib non usa 'const' in queste funzioni?
Ho il codice seguente:
static const char *words[] = { "one", "two", "three", NULL };
void main() {
puts(g_strjoinv("+", words));
}
Questo codice stampe one+two+three
. Usa una funzione GLib che unisce le stringhe.
La signature di tale funzione è:
char *g_strjoinv (const char *separator, char **str_array);
(. Per essere esatti, GLib utilizza gchar
, non char
, ma cerchiamo di ignorare questa)
Ora, mi chiedo perché il parametro è char **str_array
e non const char **str_array
. Mi costringe a fare un cast esplicito per sbarazzarsi di avvertimento del compilatore ("previsto 'char **', ma l'argomento è di tipo 'char **'"):
puts(g_strjoinv("+", (char **)words));
mi guardo e mi GLib's reference vedere che tutte le le funzioni sono definite in questo modo: accettano char **
, non const char **
.
Perché è quello? Perché GLib non usa const char **
?
La necessità di utilizzare un cast esplicito per sbarazzarsi di const rende il mio codice meno sicuro (perché il compilatore non controlla più la compatibilità degli argomenti). Inoltre mi rende nervoso perché GLib non "firma un contratto" che dice che non cambierà i miei dati.
Grande domanda, str_array sicuramente non viene modificato (?), In tal caso const avrebbe senso. – this
@ self: Sì, e non è un problema con solo questa funzione. È in * all * delle funzioni di GLib che accetta una serie di stringhe. Immagino che abbiano una buona ragione per farlo e voglio sapere di cosa si tratta. –
Si consiglia di guardare [questa domanda] (http://c-faq.com/ansi/constmismatch.html). Se tu avessi un normale 'char **' che è del tutto possibile, non saresti in grado di passarlo ad una funzione aspettando 'const char **' senza cast, quindi non risolverai un problema con dichiarandolo come tale. –