10

const 文字列リテラルを変更しようとする C プログラムがあります。今、私はこれが許可されていないことを学びました。

コンパイラでコードをコンパイルすると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

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

4

2 に答える 2

12

Clang はargv[0]それを見て、見たものに応じて動作を変更します。これは、少なくとも同じ実行可能ファイルであった4.2BSDexおよび.vi

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

于 2012-04-28T01:01:57.190 に答える
5

慣例により、コマンドが呼び出される名前は次のように渡されargv[0]ます。プログラムがこれに基づいて動作を変更することは特に珍しいことではありません。(歴史的に、lncp、およびmvは、Research Unix 上の同じ実行可能ファイルへのハードリンクであり、どのアクションを実行するかを決定するために使用されていました。また、ほとんどのシェルは、ログイン シェルであるかどうかを決定するために先頭をargv[0]探します。)同じ効果を得る方法 (オプション、環境変数など); 一般に、ゲームをプレイする代わりにこれを使用する必要があります。-argv[0]argv[0]

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

于 2012-04-28T01:01:36.287 に答える