可能是重复问题:
字符串字面值是const吗?
在ANSI C中,以下内容是否有效?
#include <stdio.h>
/* This returns "Hans" if arg != 0, "Gretel" if arg == 0 */
char* foo(int arg)
{
return arg ? "Hans" : "Gretel";
}
int main()
{
char* p_ch;
p_ch = foo(1);
printf("%s\n", p_ch);
p_ch = foo(0);
printf("%s\n", p_ch);
return 0;
}
代码在GCC/Linux下编译和运行良好。
MinGW/Windows则提示:
invalid conversion from `const char*' to `char*'
MS Visual C/C++ 2008对该代码很好。
- 我能否在初始化点之外的其他地方将
char*
变量分配给文字字符串? - 我已经阅读过字符串文字具有
static
分配类。这是否意味着它们在定义它们的函数之外是不可见的? - 从
const
类型转换为其非const
对应类型何时无效?
foo
声明为返回const char*
。但是,当编译为C++时,代码变得无效。我不是足够的标准专家来精确解释为什么... 我本来期望GCC会发出一些警告(但即使使用-Wall -Wextra
的gcc 4.6也没有)。 - Basile Starynkevitchnew
变量名的警告,以防万一您将来可能想用C ++编译器编译此代码”这样的警告会令人恼火 :-) - paxdiablogcc -Wwrite-strings
会给出相应的警告。这可能不是-Wextra
的一部分,因为C库的某些部分可能依赖于此功能;例如,strerror
具有返回类型char *
,但可能使用字符串字面值的数组来实现。 - Fred Foop_ch
仍然是有效指针 - 但我能依赖这种行为吗? - peter.slizik