GLib hakkında basit bir sorum var.Neden GLib bu işlevlerde 'const' kullanıyor?
static const char *words[] = { "one", "two", "three", NULL };
void main() {
puts(g_strjoinv("+", words));
}
Bu kod baskılar one+two+three
:
Aşağıdaki kod var. Dizeleri birleştiren bir GLib işlevi kullanır. Bu işlevin
signature geçerli:
char *g_strjoinv (const char *separator, char **str_array);
(. Tam olarak, GLib değil char
, gchar
kullanır ama en bu görmezden let)
Şimdi, parametredir neden acaba char **str_array
ve const char **str_array
. Bu derleyici'nın uyarısı kurtulmak için açık döküm yapmamı zorlar (" 'char **' ama argüman '** const char' tiptedir beklenen"):
puts(g_strjoinv("+", (char **)words));
Ben GLib's reference ve I bakmak tüm işlevlerinin şu şekilde tanımlandığını görürsünüz: char **
, const char **
değil.
Neden? Neden GLIB const char **
kullanıyor?
Yapıdan kurtulmak için açık bir döküm kullanmanız gerekiyorsa, kodum daha az güvenlidir (çünkü derleyici, argümanların uyumluluğunu artık kontrol etmemektedir). Ayrıca beni tedirgin ediyor çünkü GLib veriyi değiştirmeyeceğini söyleyen bir sözleşme imzalamıyor.
Harika bir soru, str_array kesinlikle değişmez (?), Bu durumda const anlamlı olur. – this
@self: Evet, ve bu sadece bir fonksiyonla ilgili bir problem değil. Bir dizi dizgiyi kabul eden GLib'in * tümünde * vardır. Bunu yapmak için iyi bir sebebi var sanırım ve ne olduğunu bilmek istiyorum. –
[Bu soruya] bakmak isteyebilirsiniz (http://c-faq.com/ansi/constmismatch.html). Eğer normal bir “char **” olsaydı, bu mümkün olmazsa, onu “const char **” bekleyen bir işleve çeviremezdiniz, böylece bir problemi çözemezdiniz. bunu beyan ediyor. –