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++.这是一个你不应该依赖的历史疣; 使用适当的编译器命令,并确保您的文件扩展名反映文件的真实内容.
按照惯例,调用命令的名称将作为argv[0]
; 程序基于此改变行为并不是特别罕见.(从历史上看,ln
,cp
,和mv
是硬连接到同一个可执行的研究Unix和使用argv[0]
来决定做哪些动作.此外,大多数炮弹寻找一个领先-
的argv[0]
,以决定他们是否应该是一个登录shell.)通常也有一些其他的获得相同效果的方法(选项,环境变量等); 你应该一般使用它而不是玩argv[0]
游戏.
有理由这样做,但在大多数情况下,依靠它或围绕它设计程序并不是一个好主意.
归档时间: |
|
查看次数: |
1053 次 |
最近记录: |