2012-04-28 7 views
10

私はconst文字列リテラルを修正しようとするCプログラムを持っています。今のところ、私はこれが許されないことを学びました。なぜclang ++はclangとは異なる動作をしますか?前者は後者のシンボルリンクですか?

clang test.cでコードをコンパイルすると、コンパイラは警告を表示しません。私はclang++ test.cでそれをコンパイルするときしかし、それは警告を与える:

test.cの:6:15:警告: 'CHAR *' への文字列リテラルからの変換が [-Wdeprecated書き込み可能な-文字列]を推奨されていません CHAR * s = "hello world";

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

だから私の質問はできるが、それはclangのシンボルリンクのことを考えるとclangとは異なるclang++どのように動作するかです: ^

問題はclang++clangの単なる記号リンクであることが判明したということです?

答えて

11

Clangは、argv[0]を見て、見ているものによってその動作を変更しています。これは、まれではないが、まれにしか行われない4.2BSD exviと同じ実行可能ファイルであり、おそらく遠くにある可能性があります。

この場合、clang.cファイルをCとしてコンパイルしており、clang++はC++としてコンパイルしています。これはあなたが頼りにすべきではない歴史的な疣贅です。適切なコンパイラコマンドを使用して、ファイル拡張子がファイルの実際の内容を反映していることを確認します。

+0

あなたは_bash_が 'argv [0]'を見て、動作を変更していることを意味しますか?だから、 'clang ++ 'は' clang'とは違って動作するのは難しいですね。 – RockU

+1

申し訳ありませんが、私は十分に考えていませんでした。 'clang'には難しいコードがあります。ありがとうございました:) – RockU

+1

私はこのテクニックの引用を "珍しく落胆"させることができますか? bashには意味がありませんが、興味があります。 –

5

従来、コマンドが呼び出される名前はargv[0]として渡されます。プログラムがこれに基づいて行動を変えるのは特に珍しいことではありません。 (歴史的に、lncp、そしてmvは研究Unixで同じ実行可能ファイルへのハードリンクしてみませんかするアクションを決定するためにargv[0]を使用していました。また、ほとんどのシェルは、彼らがログインシェルであるべきかどうかを決定するためにargv[0]の大手-を探してください。)多くの場合、同じ効果(オプション、環境変数など)を得る他の方法もあります。あなたは一般的にargv[0]ゲームをプレイする代わりにこれを使用するべきです。

これを行う理由はありますが、ほとんどの場合、それに頼ったり、その周りのプログラムを設計することはお勧めできません。

+0

+1私のための前兆。 – zwol

関連する問題