10

我有一个尝试修改 const 字符串文字的 C 程序。现在我了解到这是不允许的。

当我用clang test.c编译器编译代码时没有警告。但是当我用clang++ test.c它编译它时会发出警告:

test.c:6:15:警告:从字符串文字转换为 'char *' 已弃用 [-Wdeprecated-writable-strings] char *s = "hello world"; ^

问题是它clang++只是一个符号链接clang

ll `which clang++`
lrwxr-xr-x  1 root  admin  5 Jan  1 12:34 /usr/bin/clang++@ -> clang

所以我的问题是,鉴于它是 的符号链接,其clang++行为有何不同?clangclang

4

2 回答 2

12

Clang 正在查看它argv[0]并根据它看到的内容改变它的行为。这是一个不常见且不鼓励但并不罕见的技巧,至少可以追溯到 4.2BSDexvi,它们是相同的可执行文件,并且可能更远。

在这种情况下,clang将您的.c文件编译为 C,并将clang++其编译为 C++。这是一个你不应该依赖的历史缺陷;使用适当的编译器命令确保您的文件扩展名反映文件的真实内容。

于 2012-04-28T01:01:57.190 回答
5

按照惯例,调用命令的名称被传递为argv[0]; 程序基于此改变其行为并不罕见。(从历史上看,ln,cpmv是 Research Unix 上同一个可执行文件的硬链接,用于argv[0]决定执行哪个操作。此外,大多数 shell 会寻找一个引导-argv[0]决定它们是否应该是登录 shell。)通常还有一些其他的获得相同效果的方法(选项、环境变量等);您通常应该使用它而不是玩argv[0]游戏。

这样做是有原因的,但在大多数情况下,依赖它或围绕它设计程序并不是一个好主意。

于 2012-04-28T01:01:36.287 回答