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

Roc*_*ckU 10 linux macos symlink clang clang++

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

当我用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
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果它是符号链接,那么它的clang++行为会有clang什么不同clang

zwo*_*wol 12

Clang正在考虑它argv[0]并根据它看到的内容改变它的行为.这是一种不常见且令人沮丧但并不罕见的技巧,至少可以追溯到4.2BSD,ex并且vi它们是相同的可执行文件,并且可能更远.

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

  • 我不知道对"不常见"部分的引用,但是[这里是一个相当有影响力的地方,它不鼓励](http://www.gnu.org/prep/standards/html_node/User-Interfaces.html)你不知道最终用户何时可能想要重命名程序而不改变其行为的理由,例如因为你有两个不同的编译器,它们不能都是`/ usr/bin/cc`. (2认同)

gee*_*aur 5

按照惯例,调用命令的名称将作为argv[0]; 程序基于此改变行为并不是特别罕见.(从历史上看,ln,cp,和mv是硬连接到同一个可执行的研究Unix和使用argv[0]来决定做哪些动作.此外,大多数炮弹寻找一个领先-argv[0],以决定他们是否应该是一个登录shell.)通常也有一些其他的获得相同效果的方法(选项,环境变量等); 你应该一般使用它而不是玩argv[0]游戏.

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