【问题标题】:How to declare constant array param in C?如何在 C 中声明常量数组参数?
【发布时间】:2016-03-27 17:15:20
【问题描述】:

我会写

#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;
}

这可以编译,但我真的不希望它编译。

【问题讨论】:

  • how can I make it so this declaration style makes argv itself const? 你不应该那样做。 argv 不是常量。
  • @Matt argv 是指向main 的指针参数。没有理由不能声明为const,只要main 不更改它。这就是 OP 问题的重点。
  • argv 作为指针不必是 const 并且该数组由标准定义为不是 const 限定的。见 5.1.2.2.1p2
  • @Olaf main 是一个函数。如果它想将其参数之一限制为const,为什么不能呢?我知道它没有必须声明它const,但它应该是可能的。它实际上暴露了 C 中数组参数表示法的一个缺陷,因为使用指针表示法可以实现所需的效果,代价是放弃数组大小信息。
  • char * argv[argc + 1]char * argv[]char ** argv 之间没有区别。那么为什么不坚持到最后呢?

标签: c arrays parameters constants


【解决方案1】:

参见 C 标准,6.7.3p9

如果数组类型的规范包括任何类型限定符,则元素类型是如此限定的,而不是数组类型。 ...

因此,const 不能应用于数组名称。要么使用指针语法,要么使用非const 指针。请注意,这对大多数架构上的正确代码没有影响。

由于argv 在两个版本中都是指向第一个元素的指针,请参见6.7.6.3p7,实际上char **argvchar *argv[] 参数之间没有区别。您不能将数组(作为数组)传递给函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2011-06-23
    • 2019-02-23
    相关资源
    最近更新 更多