2016-03-27 2 views
2

я могу написатьКак объявить параметр постоянного массива в C?

#include <stdio.h> 

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

И это не потому, что компилировать argv является Const (что хорошо).

Однако документ, который я прочитал, предложил char * argv[argc + 1] как лучший способ объявить argv. Но как я могу это сделать, чтобы этот стиль объявления делал argv сам const?

#include <stdio.h> 

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

Это компилируется, но мне бы очень понравилось.

+1

'Как я могу сделать так, чтобы этот стиль объявления создавал argv сам const?' Вы не должны этого делать. 'argv' не const. – Matt

+1

@Matt 'argv' является аргументом указателя на' main'. Нет причин, по которым он не может быть объявлен 'const', если' main' его не изменяет. В этом весь смысл вопроса ОП. –

+0

'argv' как указатель не обязательно должен быть' const', а массив определяется стандартом, чтобы не быть 'const' квалифицированным. См. 5.1.2.2.1p2 – Olaf

ответ

3

См стандарт С, 6.7.3p9:

Если спецификация типа массива включает в себя любые определители типа, то тип элемента SO- квалифицирован, а не тип массива. ...

Таким образом, const не могут быть применены к имени массива. Либо вы используете синтаксис указателя, либо используете указатель не const. Обратите внимание, что это не влияет на правильный код на большинстве архитектур.

Как argv является указателем на первый элемент в обеих версиях см 6.7.6.3p7, нет фактически никакой разницы между char **argv и char *argv[] аргументами. Вы не можете передать массив (как массив) функции.

Смежные вопросы