【发布时间】:2018-05-29 22:05:42
【问题描述】:
这是一个愚蠢的问题,但我似乎无法正确回答。我遇到了另一个question,但给出的答案没有正确解决我特定用例中的警告。
我试图在posix_spawn 函数中声明一个常量字符串数组作为argv 传递,但GCC 抱怨const 被丢弃。请参阅下面的示例代码:
#include <stdio.h>
/* Similar signature as posix_spawn() shown for brevity. */
static void show(char *const argv[])
{
unsigned i = 0;
while(argv[i] != NULL) {
printf("%s\n", argv[i++]);
}
}
int main(void)
{
const char exe[] = "/usr/bin/some/exe";
char *const argv[] = {
exe,
"-a",
"-b",
NULL
};
show(argv);
return 0;
}
并将其编译为:
gcc -std=c89 -Wall -Wextra -Wpedantic -Wwrite-strings test.c -o test
test.c: In function ‘main’:
test.c:17:9: warning: initializer element is not computable at load time [-Wpedantic]
exe,
^
test.c:17:9: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
test.c:18:9: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
"-a",
^
test.c:19:9: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
"-b",
^
既然exe 本身就是一个常量字符串,比如"-a" 和"-b",我认为它是正确的。但 GCC 似乎不同意。从数组中删除 exe 并删除 -Wwrite-strings 编译时不会出现警告。也许我错过了一些太基本的东西。
如何声明一个 const 字符串数组?
【问题讨论】:
-
“我遇到了另一个问题” - 该问题的公认答案是正确的(并且没有“警告”),但是该问题不涉及
const,因此不是明确你为什么链接它 -
该操作试图将文字常量字符串放入非常量数组中。 GCC 通常会发出警告。在我的情况下,由于
-Werror,它会失败并出现错误。 -
字符串文字在 C 中不是
const。代码是正确的。您看到警告是因为您使用了开关-Wwrite-strings,它有意为正确的代码生成警告。 -
我认为字符串文字存储在只读部分中,而与警告开关无关,除非还使用了
-fwritable-strings。但是你是对的,标准并没有指定这种行为。更正了我的问题的措辞。谢谢。 -
它们可以存储在只读区域,但无论哪种方式都没有
const限定符。在标准 C 中,这只是未定义的行为,无需诊断即可写入它们。-Wwrite-strings尝试捕获写入尝试,但当您需要调用不正确的 API 时也会给出误报
标签: c