C言語(C99)の variable length array というものを初体験
Sat Apr 20 01:17:12 JST 2013 (modified: Fri Sep 29 21:38:45 JST 2017)
views: 2838, keywords:プログラミング,C言語 この記事は最終更新日が7年以上前のものです。
こちらを拝読してびっくりしたので検証しました。
http://cpplover.blogspot.jp/2013/04/llvmclanglinuxgcc.html
variable length array自体は、GCCは大昔から拡張機能としてサポートしている。C99では正式に採用された。配列のサイズにconstでない変数をぶち込んでも良いとのこと・・・。しかも大昔から。ほんまかい。
こんなコードを書いて・・・
uedamac:~ ueda$ cat hoge.c#include
void kidding_me(size_t size)
{int nums[size];
for(int i=0;i<size;i++){
nums[i] = i;"%d\\n",nums[i]);
printf(
}
}
int main(int argc, char const* argv[])
{4);
kidding_me(return 0;
}
こんぴゃーるして実行。-std=c99 というオプションが必要なのか?
uedamac:~ ueda$ gcc ./hoge.c
./hoge.c: In function ‘kidding_me’:
./hoge.c:7: error: ‘for’ loop initial declaration used outside C99 mode
uedamac:~ ueda$ gcc -std=c99 ./hoge.c
uedamac:~ ueda$
あ、サイズが可変なことより、for(int ...の方が怒られているのね。もしかしてオプション要らないんじゃないか?
書き直してコンパイル・・・と。
uedamac:~ ueda$ cat hoge.c
#include
void kidding_me(size_t size)
{
int nums[size];
int i=0;
for(i=0;i<size;i++){
nums[i] = i;
printf("%d\\n",nums[i]);
}
}
int main(int argc, char const* argv[])
{
kidding_me(4);
return 0;
}
uedamac:~ ueda$ gcc ./hoge.c
uedamac:~ ueda$ ./a.out
0
1
2
3
特に技術的にごちゃごちゃ書く元気はありませんが、一言言わせてください。
気持ち悪い!
以上です。これは・・・使わない方がよいと思う・・・。いや、オッサンだからそう思うだけか・・・。ポータビリティーというより、なんかメモリの使い方の前提が分からなくなりそうなので・・・。シェルスクリプトは動けばいいというのが持論なんだけど、Cのコードはちょっと違うのかなと。はたまた自分の頭が固いのか。
これ知ってる人ってどれだけいるんだろ?