我是一个有用的助手,可以翻译文本。
这段代码打印出
该函数的签名为:
我查看了GLib参考文档,发现所有函数都是这样定义的:它们接受
我对GLib有一个简单的问题。
我有以下代码:
static const char *words[] = { "one", "two", "three", NULL };
void main() {
puts(g_strjoinv("+", words));
}
这段代码打印出
one+two+three
。它使用了一个GLib函数来连接字符串。该函数的签名为:
char *g_strjoinv (const char *separator, char **str_array);
准确来说,GLib使用gchar而不是char
,但我们忽略这个。
现在,我想知道为什么参数是char **str_array
而不是const char **str_array
。这迫使我进行显式转换以消除编译器的警告(“预期为'char **',但参数类型为'const char **'”):
puts(g_strjoinv("+", (char **)words));
我查看了GLib参考文档,发现所有函数都是这样定义的:它们接受
char **
而不是const char **
。为什么呢?为什么GLib不使用const char **
呢?使用显式强制转换来去除const会使我的代码更不安全(因为编译器不再检查参数的兼容性)。这也让我感到紧张,因为GLib没有“签署合同”说明它不会更改我的数据。
char **
,完全有可能,您将无法将它传递给期望const char **
的函数,因此通过声明为这样并不能解决问题。 - Crowman