为什么clang ++与clang的行为不同,因为前者是后者的符号链接?

时间:2012-04-28 00:58:16

标签: linux macos clang symlink clang++

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

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

  

test.c:6:15:警告:不推荐从字符串文字转换为'char *'         [-Wdeprecated可写串]       char * s =“你好世界”;                 ^

问题是结果clang++只是clang的符号链接:

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

所以我的问题是,clang++如果clang的符号链接是clang,那么{{1}}与{{1}}的行为有何不同?

2 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:5)

按照惯例,调用命令的名称将作为argv[0]传递;程序基于此改变行为并不是特别罕见。 (从历史上看,lncpmv是研究Unix上相同可执行文件的硬链接,并使用argv[0]来决定要执行的操作。此外,大多数shell都会查找-中的前导argv[0]来决定它们是否应该是登录shell。)通常还有其他方法可以获得相同的效果(选项,环境变量等);你通常应该使用它而不是玩argv[0]游戏。

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