我有一个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}}的行为有何不同?
答案 0 :(得分:12)
Clang正在查看其argv[0]
,并根据其看到的内容改变其行为。这是一个不常见且气馁,但并不罕见的伎俩至少可以追溯到4.2BSD ex
和vi
,它们是相同的可执行文件,可能更远。
在这种情况下,clang
正在将您的.c
文件编译为C,clang++
正在将其编译为C ++。这是一个你不应该依赖的历史疣;使用适当的编译器命令和确保您的文件扩展名反映了文件的真实内容。
答案 1 :(得分:5)
按照惯例,调用命令的名称将作为argv[0]
传递;程序基于此改变行为并不是特别罕见。 (从历史上看,ln
,cp
和mv
是研究Unix上相同可执行文件的硬链接,并使用argv[0]
来决定要执行的操作。此外,大多数shell都会查找-
中的前导argv[0]
来决定它们是否应该是登录shell。)通常还有其他方法可以获得相同的效果(选项,环境变量等);你通常应该使用它而不是玩argv[0]
游戏。
有理由这样做,但在大多数情况下依靠它或围绕它设计程序并不是一个好主意。