Ich stolperte über ein kleines Problem, während ich versuchte, const-korrekten Code zu machen.Kann GCC mich warnen, die Felder einer Const-Struktur in C99 zu modifizieren?
Ich hätte gerne eine Funktion geschrieben, die einen Zeiger auf eine const-Struktur nimmt, um dem Compiler zu sagen "Bitte sagen Sie mir, wenn ich die Struktur modifiziere, weil ich wirklich nicht will".
Es kam plötzlich zu meinem Kopf, dass die Compiler mir, dies tun können:
struct A
{
char *ptrChar;
};
void f(const struct A *ptrA)
{
ptrA->ptrChar[0] = 'A'; // NOT DESIRED!!
}
was verständlich ist, da tatsächlich was konst der Zeiger selbst ist, aber nicht der Typ, es verweist. Ich möchte, dass der Compiler mir sagt, dass ich etwas mache, was ich nicht tun möchte, wenn das überhaupt möglich ist.
Ich habe gcc als meinen Compiler verwendet. Obwohl ich weiß, dass der obige Code legal sein sollte, überprüfte ich trotzdem, ob es trotzdem eine Warnung geben würde, aber nichts kam. Meine Befehlszeile war:
gcc -std=c99 -Wall -Wextra -pedantic test.c
Ist es möglich, um dieses Problem zu umgehen? Kein
dieser Fall funktioniert zur Zuweisung von Mitglied. ZB "ptrA-> ptrChar = malloc (2);' Welches Element zeigt, ist nicht so. " – BLUEPIXY
[Ähnliche Frage] (http://StackOverflow.com/Questions/13181546/const-correctness-for-structs-with-pointers) –
Zu diesem Zweck habe ich normalerweise einen Header, der nur nach vorne deklariert 'struct a;', und einige Funktionsdeklarationen wie in 'a_do_something (const struct * a);' Die vollständige Definition von 'struct A' in eine Header-Datei ist nur selten erforderlich. Sie setzen eine Menge Funktionen wie Ihr 'f' in separate Übersetzungseinheiten, wobei' f' nur irgendwie ptrA verwendet wie 'stuff = a_do_etwas (ptrA);' –