2016-03-27 11 views
2

kann ichWie deklariere konstanten Array-Parameter in C?

#include <stdio.h> 

int main(const int argc, const char * const * const argv) { 
    argv = NULL; 
    printf("Hello, world\n"); 
    return 0; 
} 

schreiben Und das nicht kompilieren, weil argv const (was gut ist) ist.

Allerdings schlug ein Dokument, das ich las, char * argv[argc + 1] als eine bessere Art vor, argv zu erklären. Aber wie kann ich es so machen, dass dieser Deklarationssatz Argv selbst const macht?

#include <stdio.h> 

int main(const int argc, const char * const const argv[argc + 1]) { 
    argv = NULL; 
    printf("Hello, world\n"); 
    return 0; 
} 

Dies kompiliert, aber ich möchte wirklich nicht zu.

+1

'wie kann ich es so machen, dass dieser Deklarationsstil argv selbst const macht?' Das sollten Sie nicht tun. 'argv' ist nicht const. – Matt

+1

@Matt 'argv' ist ein Zeigerargument zu' main'. Es gibt keinen Grund, warum es nicht als "const" deklariert werden kann, solange "main" es nicht ändert. Das ist der Kern der Frage von OP. –

+0

'argv' als Zeiger muss nicht' const' sein und das Array wird vom Standard definiert, um auch nicht 'const'-qualifiziert zu sein. Siehe 5.1.2.2.1p2 – Olaf

Antwort

3

Siehe C-Standard, 6.7.3p9:

Wenn die Spezifikation eines Arrays Typ Jede Art Qualifizierer umfasst, der Elementtyp sogenannter qualifiziert, nicht der Array-Typ ist. ...

So kann die const nicht auf den Array-Namen angewendet werden. Entweder verwenden Sie die Pointer-Syntax oder leben mit dem nicht-const Zeiger. Beachten Sie, dass dies für die meisten Architekturen keinen Einfluss auf den korrekten Code hat.

argv Wie in beiden Versionen ein Zeiger auf das erste Element ist, siehe 6.7.6.3p7, gibt es in der Tat keinen Unterschied zwischen char **argv und char *argv[] Argumenten. Sie können ein Array (als Array) nicht an eine Funktion übergeben.