« [ 備忘録 ] Inside Amazon | トップページ | [.NET] WF ( Windows Workflow Foundation ) »

2007/12/03

[ C ] 確認したのか?

char* value;

なんて書式のほうがわかりやすかったはずだ。

今は文法的にこれは許されていないから、ポインタ変数の定義をする場合は、普通は仕方なく、

char * value;

と「*」を離して書くくらいしかできない。

実は最近のコンパイラはこのどちらの表現でもちゃんと解釈して「通る」のだが、古いコンパイラではこの文法を通さないものもあったため、教科書ではどうしても、

char *value;

と書いてあるものが多いのだ。

( 三田典玄の「体育館の裏話」 関数の話(5), 2007/10/19 )

えっと、何を何を言っているんだろうか?

char* value; がコンパイルできない???

ちゃんと確かめてからほざいてほしいものだ。gcc 2.95.3, gcc 3.4.4, gcc 4.1.2 で確認したが、全く問題なくコンパイルできるぞ。MSVC コンパイラ Version 14.00.50727.762 でも確認したが問題なくコンパイルできる。

#include 

int main( void )
{
	char* value = "hoge";
	
	printf( "%s\n", value );
	
	return 0;
}

上記サンプルコードをコンパイルしてみよう。まずは gcc 2.95.3

bash-2.05$ gcc --version
2.95.3
bash-2.05$ gcc test.c
bash-2.05$ ./a.out
hoge

gcc 2.95.3 はかなり古いコンパイラだが、エラーはもちろん警告すら表示されない。
gcc 4.1.2 でも確認を行ったが、こちらでもエラー・警告は一切表示されなかった。

では次に Microsoft の C/C++ コンパイラでコンパイルしてみよう。
わたしの環境では以下のようになった。

F:\>cl test.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

test.c
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.

/out:test.exe
test.obj

F:\>test.exe
hoge

みてのとおりこちらでもエラーにも警告にもならない。gcc 2.95.3 以前は全く知らないのだが、少なくとも「今のコンパイラ」ではエラーにも警告にもならないというのは上記の結果の通りだ。もしかしたらエラーになるすごくマイナーなコンパイラがあるのかもしれないが、わたしは char* value; という表記がエラーになると聞いたことは一度もない。

そのほか、char を 「8ビット符号付き変数」と解説している ( 正しくは、C の各型がどの程度の精度を持つのかは実装依存 ) など、全く正しい理解がされていないように思える。

「続く」とあるのだが、続きを書いて無理解をさらすより、C を一通り復習しなおしたほうがいいと思いますよ。

|

« [ 備忘録 ] Inside Amazon | トップページ | [.NET] WF ( Windows Workflow Foundation ) »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [ C ] 確認したのか?:

« [ 備忘録 ] Inside Amazon | トップページ | [.NET] WF ( Windows Workflow Foundation ) »