【发布时间】:2011-11-23 15:17:25
【问题描述】:
以下内容在 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*变量分配给其他地方的文字字符串吗? - 我读过字符串文字有
staticalocation 类。这是否意味着它们在定义它们的函数之外是不可见的? - 从什么时候开始,从
const类型到它们的非 const 类型的转换无效?
【问题讨论】:
-
我会声明
foo会返回const char*。当编译为 C++ 时,代码变得无效。我还不足以作为一个标准的专家来准确地解释为什么......我本来希望 GCC 会给出一些警告(但即使是带有-Wall -Wextra的 gcc 4.6 也不会)。 -
@Basile,因为 gcc 正在编译 C 代码。这在 C 中没有有问题。如果你用 g++ 编译它,那将是另一回事,但如果你尝试编译完全有效的 C 代码,gcc 显然不会认为这是一个问题。像“不能使用
new的变量名,如果有一天你可能想用 C++ 编译器编译它”这样的警告会非常烦人:-) -
@BasileStarynkevitch:
gcc -Wwrite-strings给出了适当的警告。这可能不是-Wextra的一部分,因为C 库的某些部分可能依赖于这个特性;例如,strerror的返回类型为char*,但可以使用字符串字面量数组来实现。 -
感谢您的所有回答。无论如何,既然字符串文字属于
static分配类,它们在技术上不应该从函数foo() 之外不可见吗?是的,我知道,静态变量只是一个伪装的全局变量,因此它们会一直存在到程序终止,而p_ch仍然是一个有效的指针 - 但我可以依赖这种行为吗?
标签: c string-literals