Ich habe eine einfache Frage zu GLib.Warum verwendet GLib in diesen Funktionen nicht 'const'?
Ich habe den folgenden Code:
static const char *words[] = { "one", "two", "three", NULL };
void main() {
puts(g_strjoinv("+", words));
}
Dieser Code druckt one+two+three
. Es verwendet eine GLib-Funktion, die Strings verbindet.
Die signature dieser Funktion ist:
char *g_strjoinv (const char *separator, char **str_array);
(. Um genau zu sein, GLib verwendet gchar
, nicht char
, aber lassen Sie uns dies ignorieren)
Nun frage ich mich, warum der Parameter char **str_array
und nicht . Es zwingt mich eine explizite Umwandlung zu tun der Compiler Warnung loszuwerden („erwartet‚char **‘aber Argument ist vom Typ‚const char **‘“):
puts(g_strjoinv("+", (char **)words));
Ich sehe in GLib's reference und ich siehe alle die Funktionen dort sind so definiert: sie akzeptieren char **
, nicht const char **
.
Warum ist das? Warum verwendet GLib const char **
nicht?
Die Notwendigkeit, einen expliziten Cast zu verwenden, um const loszuwerden, macht meinen Code weniger sicher (weil der Compiler nicht mehr die Kompatibilität der Argumente überprüft). Es macht mich auch nervös, weil GLib keinen Vertrag unterschreibt, dass meine Daten nicht geändert werden.
Große Frage, str_array wird sicherlich nicht geändert (?), In diesem Fall würde const Sinn machen. – this
@self: Ja, und es ist kein Problem mit nur dieser einen Funktion. Es ist in * all * GLibs Funktionen, die ein Array von Strings akzeptieren. Ich denke, sie haben einen guten Grund dafür und ich möchte wissen, was es ist. –
Sie können sich [diese Frage] (http://c-faq.com/ansi/contmismatch.html) ansehen. Wenn du ein normales 'char **' hättest, was durchaus möglich ist, könntest du es auch nicht an eine Funktion übergeben, die 'const char **' ohne eine Umwandlung erwartet, also würdest du kein Problem lösen es als solches deklarieren. –