コンパイラの対応している規格
コンパイラの対応している規格
自分が使っているコンパイラがどの規格に対応なのか気になり
調べようと思ったのですが検索しても表示させる方法がわかりませんでした。
調べようとしているのはCの規格です。
あとC++も
gcc -dumpversionとすればコンパイラのバージョンは表示されるのですが
規格のバージョンは表示されません。
コンパイラで表示させる方法があれば教えて下さい。
表示ができないのであれば次のコンパイラではどの規格に対応なのか教えてほしいです。
・VC++2010Express(C99は未対応と書いていたのでC95? C++はC++03にC++11の一部の機能?)
・Cygwin gccバージョン3.4.4
・MinGW gccバージョン4.3.0
・Linux Ubuntu8.0.4端末 gccバージョン4.2.4
一応ためしてみたのは
1. // のコメント
2. printfのあとにint i;
3. void main(){}
4. for(int i=0;i<10;i++){}
で1,2はコンパイル通り、3,4はコンパイルエラーでした。
ということはC99はどれも対応していないということでしょうか。
下の3つはソフトが違うのにコンパイラはどれもgccなのですがVC++はgccではないですよね?
ここって一人で複数の質問(1つが解決していないのにもうひとつトピックたてる)
ってOKですか?もうひとつこの話とは別で聞きたいことがあるんです。
調べようと思ったのですが検索しても表示させる方法がわかりませんでした。
調べようとしているのはCの規格です。
あとC++も
gcc -dumpversionとすればコンパイラのバージョンは表示されるのですが
規格のバージョンは表示されません。
コンパイラで表示させる方法があれば教えて下さい。
表示ができないのであれば次のコンパイラではどの規格に対応なのか教えてほしいです。
・VC++2010Express(C99は未対応と書いていたのでC95? C++はC++03にC++11の一部の機能?)
・Cygwin gccバージョン3.4.4
・MinGW gccバージョン4.3.0
・Linux Ubuntu8.0.4端末 gccバージョン4.2.4
一応ためしてみたのは
1. // のコメント
2. printfのあとにint i;
3. void main(){}
4. for(int i=0;i<10;i++){}
で1,2はコンパイル通り、3,4はコンパイルエラーでした。
ということはC99はどれも対応していないということでしょうか。
下の3つはソフトが違うのにコンパイラはどれもgccなのですがVC++はgccではないですよね?
ここって一人で複数の質問(1つが解決していないのにもうひとつトピックたてる)
ってOKですか?もうひとつこの話とは別で聞きたいことがあるんです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: コンパイラの対応している規格
私が把握している情報です。
・gccの対応状況。
「Status of C99 features in GCC - GNU Project - Free Software Foundation (FSF)」
http://gcc.gnu.org/c99status.html
「C++0x/C++11 Support in GCC - GNU Project - Free Software Foundation (FSF)」
http://gcc.gnu.org/projects/cxx0x.html
・VC++2010はC95はほぼ対応していると思いますが一部未対応があるようです。C99には対応していません。
C++11のVC++10(2010)とVC++11の対応状況。
「C++11 Features in Visual C++ 11 - Visual C++ Team Blog - Site Home - MSDN Blogs」
http://blogs.msdn.com/b/vcblog/archive/ ... 09291.aspx
【追記】
2つのトピックをちゃんと管理できるなら2つのトピックぐらいなら構いません。
[補足]
gccの場合-std=c99オプションが必要な場合があります。
・gccの対応状況。
「Status of C99 features in GCC - GNU Project - Free Software Foundation (FSF)」
http://gcc.gnu.org/c99status.html
「C++0x/C++11 Support in GCC - GNU Project - Free Software Foundation (FSF)」
http://gcc.gnu.org/projects/cxx0x.html
・VC++2010はC95はほぼ対応していると思いますが一部未対応があるようです。C99には対応していません。
C++11のVC++10(2010)とVC++11の対応状況。
「C++11 Features in Visual C++ 11 - Visual C++ Team Blog - Site Home - MSDN Blogs」
http://blogs.msdn.com/b/vcblog/archive/ ... 09291.aspx
【追記】
2つのトピックをちゃんと管理できるなら2つのトピックぐらいなら構いません。
[補足]
gccの場合-std=c99オプションが必要な場合があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: コンパイラの対応している規格
gccについては以下などが参考になると思います。zxzy さんが書きました: 調べようとしているのはCの規格です。
あとC++も
表示ができないのであれば次のコンパイラではどの規格に対応なのか教えてほしいです。
・VC++2010Express(C99は未対応と書いていたのでC95? C++はC++03にC++11の一部の機能?)
・Cygwin gccバージョン3.4.4
・MinGW gccバージョン4.3.0
・Linux Ubuntu8.0.4端末 gccバージョン4.2.4
http://gcc.gnu.org/c99status.html
http://gcc.gnu.org/projects/cxx0x.html
そもそも、3はほとんどの環境で処理系依存じゃないですか?zxzy さんが書きました: 一応ためしてみたのは
1. // のコメント
2. printfのあとにint i;
3. void main(){}
4. for(int i=0;i<10;i++){}
で1,2はコンパイル通り、3,4はコンパイルエラーでした。
ということはC99はどれも対応していないということでしょうか。
http://www.kijineko.co.jp/tech/supersti ... -main.html
4についてはgcc4.3.4だと通るようです。(gccに何らかのオプションを渡してあげないといけないのかな?)
http://ideone.com/m52SE
最後に編集したユーザー bitter_fox on 2012年3月13日(火) 17:55 [ 編集 1 回目 ]
Re: コンパイラの対応している規格
どの規格に対応しているかとのことであれば...
__STDC__マクロが定義されていなければ非標準処理系
__STDC__マクロが1で、__STDC_VERSION__マクロが定義されなければ、C90
__STDC__マクロが1で、__STDC_VERSION__マクロが199409Lならば、AMD1
__STDC__マクロが1で、__STDC_VERSION__マクロが199901Lならば、C99
__STDC__マクロが1で、__STDC_VERSION__マクロが201112Lならば、C11
です。
ただし、中途半端に新しい規格に対応している場合もあるので要注意です。
たとえば、GCC 4.6.1で-std=c1xオプションを付けた場合、__STDC_VERSION__マクロは201000Lになります。
__STDC__マクロが定義されていなければ非標準処理系
__STDC__マクロが1で、__STDC_VERSION__マクロが定義されなければ、C90
__STDC__マクロが1で、__STDC_VERSION__マクロが199409Lならば、AMD1
__STDC__マクロが1で、__STDC_VERSION__マクロが199901Lならば、C99
__STDC__マクロが1で、__STDC_VERSION__マクロが201112Lならば、C11
です。
ただし、中途半端に新しい規格に対応している場合もあるので要注意です。
たとえば、GCC 4.6.1で-std=c1xオプションを付けた場合、__STDC_VERSION__マクロは201000Lになります。
- tk-xleader
- 記事: 158
- 登録日時: 13年前
- 連絡を取る:
Re: コンパイラの対応している規格
void main(){}ってC99で認められていましたっけ? 確か処理系定義のはずでは?
Re: コンパイラの対応している規格
回答ありがとうございます。
softya(ソフト屋) さん、 bitter_foxさん
やはりこういう情報がまとめられているサイトは英語になりますか。
下の方の丁寧な説明部分(?)はよくわかりませんでしたが表から
なんとなくはわかりました。
完全にC99対応っていうのはないのですね。
前回のトピックでは思っていた以上に長くなり、
またいただいた回答で知らない用語や気になることがあり、調べたり実行してみたりで
返信がおそくなりましたが今回はそれほど長くならないと思いますので大丈夫だと思います。
しかし、流し読みだったためこの部分
「C99ならvoid main(){}が使える」
と変換されて頭に入ってました。
処理系依存なのでC99であったとしてもvoid main(){}が使えるとはかぎらないですね。
たかぎ さん
検索してもこういうのがあると見つけられませんでした。
試してみたのですが、
VC++2010Expressでは 識別子"__STDC__"が宣言されていません
gccでもundeclared (first use this function)
と出ました。
そこで、softya(ソフト屋) さんの補足に書かれている「-std=c99」をつけると
1 , 199901
と定義されていてC99でコンパイルできているようです。
疑問に思うのですがVC++もgccも非標準処理系なのですか?
非標準処理系という用語をよく理解していないのですが標準でないのだから
特殊なものでしょう。
有名で多くの人が使うようなVC++やgccが標準でないのなら標準なものって
どういうものですか?
gccはオプションでC99にできましたがオプションなしでは非標準のようですし。
それと「-std=c1x」オプションはgcc4.3.0だと
error: unrecognized command line option "-std=c1x"
とエラーでした
"c1x"を"c11","c0x","c++11","c++1x"としてもエラーで
"c++0x"とすると
error: '__STDC_VERSION__' was not declared in this scope
にエラーメッセージが変わりました。
C++で__STDC_VERSION__マクロが定義されなければなんになるのでしょうか?C++03?
ちゃんと理解しながら丁寧に読むべきですね。
softya(ソフト屋) さん、 bitter_foxさん
やはりこういう情報がまとめられているサイトは英語になりますか。
下の方の丁寧な説明部分(?)はよくわかりませんでしたが表から
なんとなくはわかりました。
完全にC99対応っていうのはないのですね。
管理というと放置したりせずに回答に対しすぐに返信すればいいのですよね。softya(ソフト屋) さんが書きました: 【追記】
2つのトピックをちゃんと管理できるなら2つのトピックぐらいなら構いません。
前回のトピックでは思っていた以上に長くなり、
またいただいた回答で知らない用語や気になることがあり、調べたり実行してみたりで
返信がおそくなりましたが今回はそれほど長くならないと思いますので大丈夫だと思います。
このサイトはちょうど数日前に見ました。bitter_fox さんが書きました: そもそも、3はほとんどの環境で処理系依存じゃないですか?
http://www.kijineko.co.jp/tech/supersti ... -main.html
しかし、流し読みだったためこの部分
がしたがって、C99 に対応していない処理系では、main の返却値の型はやはり int でなければならないのです。
「C99ならvoid main(){}が使える」
と変換されて頭に入ってました。
処理系依存なのでC99であったとしてもvoid main(){}が使えるとはかぎらないですね。
たかぎ さん
こういうものがあったのですか。たかぎ さんが書きました:どの規格に対応しているかとのことであれば...
__STDC__マクロが定義されていなければ非標準処理系
__STDC__マクロが1で、__STDC_VERSION__マクロが定義されなければ、C90
__STDC__マクロが1で、__STDC_VERSION__マクロが199409Lならば、AMD1
__STDC__マクロが1で、__STDC_VERSION__マクロが199901Lならば、C99
__STDC__マクロが1で、__STDC_VERSION__マクロが201112Lならば、C11
です。
ただし、中途半端に新しい規格に対応している場合もあるので要注意です。
たとえば、GCC 4.6.1で-std=c1xオプションを付けた場合、__STDC_VERSION__マクロは201000Lになります。
検索してもこういうのがあると見つけられませんでした。
試してみたのですが、
VC++2010Expressでは 識別子"__STDC__"が宣言されていません
gccでもundeclared (first use this function)
と出ました。
そこで、softya(ソフト屋) さんの補足に書かれている「-std=c99」をつけると
1 , 199901
と定義されていてC99でコンパイルできているようです。
疑問に思うのですがVC++もgccも非標準処理系なのですか?
非標準処理系という用語をよく理解していないのですが標準でないのだから
特殊なものでしょう。
有名で多くの人が使うようなVC++やgccが標準でないのなら標準なものって
どういうものですか?
gccはオプションでC99にできましたがオプションなしでは非標準のようですし。
それと「-std=c1x」オプションはgcc4.3.0だと
error: unrecognized command line option "-std=c1x"
とエラーでした
"c1x"を"c11","c0x","c++11","c++1x"としてもエラーで
"c++0x"とすると
error: '__STDC_VERSION__' was not declared in this scope
にエラーメッセージが変わりました。
C++で__STDC_VERSION__マクロが定義されなければなんになるのでしょうか?C++03?
上記の通り勘違いです。tkmakwins15 さんが書きました:void main(){}ってC99で認められていましたっけ? 確か処理系定義のはずでは?
ちゃんと理解しながら丁寧に読むべきですね。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: コンパイラの対応している規格
ヤヤコシイので分けますが、
・C言語の対応
__STDC__に関しては、VC++は/TCでコンパイルしても無いので非標準処理系。
gcc4.3は__STDC__に関しては対応しているのでC90相当。-std=c99でC99相当。
・C++の対応。
もう少し調べてみます。
・C言語の対応
__STDC__に関しては、VC++は/TCでコンパイルしても無いので非標準処理系。
gcc4.3は__STDC__に関しては対応しているのでC90相当。-std=c99でC99相当。
・C++の対応。
もう少し調べてみます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: コンパイラの対応している規格
で「C11」と検索してプログラム関係のことが出て来なかったのでたかぎ さんが書きました: __STDC__マクロが1で、__STDC_VERSION__マクロが201112Lならば、C11
C++11のことだろうと思ってC++もこの方法でいいのかと思ったのですが
「C11 C言語」と検索するとC言語でC11が出てきてC11というのがあるのを知りました。
なのでC++1xとかC++11で試したのはおかしかったですね。
Re: コンパイラの対応している規格
Visual C++では、/Zaオプションを付ければ__STDC__マクロが定義されます。softya(ソフト屋) さんが書きました:__STDC__に関しては、VC++は/TCでコンパイルしても無いので非標準処理系。
Re: コンパイラの対応している規格
C++に関して,規格上では__cplusplusで確認することができます。
なお,VC++ 2010の場合,/Zaを付けても__STDC_VERSION__は定義されません。また,C++モードでは,/Zaを付けても__STDC__は定義されません。
また,VC++ 2010のC++コンパイラの非標準事項については,Nonstandard Behaviorに書かれています。
- 199711L : ISO/IEC 14882:1998またはISO/IEC 14882:2003に準拠
- 201103L : ISO/IEC 14882:2011に準拠
なお,VC++ 2010の場合,/Zaを付けても__STDC_VERSION__は定義されません。また,C++モードでは,/Zaを付けても__STDC__は定義されません。
また,VC++ 2010のC++コンパイラの非標準事項については,Nonstandard Behaviorに書かれています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: コンパイラの対応している規格
すいません。/Za/Zcのことは忘れてました。
「/Za、/Ze (言語拡張機能の無効化) (C++)」
http://msdn.microsoft.com/ja-jp/library ... s.80).aspx
「/Zc」
http://msdn.microsoft.com/ja-jp/library ... s.80).aspx
日ごろ互換問題に取り組んでいないとボロが出るなぁ。
「/Za、/Ze (言語拡張機能の無効化) (C++)」
http://msdn.microsoft.com/ja-jp/library ... s.80).aspx
「/Zc」
http://msdn.microsoft.com/ja-jp/library ... s.80).aspx
日ごろ互換問題に取り組んでいないとボロが出るなぁ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: コンパイラの対応している規格
たかぎ さんが書きました: Visual C++では、/Zaオプションを付ければ__STDC__マクロが定義されます。
そのようなオプションがあるのですね。softya(ソフト屋) さんが書きました:すいません。/Za/Zcのことは忘れてました。
「/Za、/Ze (言語拡張機能の無効化) (C++)」
http://msdn.microsoft.com/ja-jp/library ... s.80).aspx
「/Zc」
http://msdn.microsoft.com/ja-jp/library ... s.80).aspx
日ごろ互換問題に取り組んでいないとボロが出るなぁ。
__cplusplusで確認できました。YuO さんが書きました:C++に関して,規格上では__cplusplusで確認することができます。VC++ 2010は/Zaや/Zcオプションにかかわらず199711Lを返します。
- 199711L : ISO/IEC 14882:1998またはISO/IEC 14882:2003に準拠
- 201103L : ISO/IEC 14882:2011に準拠
しかし、gccだと1と表示されました。
調べてみると定義されているかどうかでC++か判断するのに使うものみたいなので
定義されている値が規格の日付?とは限らないみたいですね。
また、C++の標準仕様でなくコンパイラによってないものもあるみたいなので
絶対にこれでわかるというわけでもないのですね。
http://www.geocities.jp/ky_webid/cpp/language/038.html
聞きたかった、自分の使っているコンパイラの対応状況と調べ方もわかったので
解決にしたいと思います。
回答してくれた方々ありがとうございました。
Re: コンパイラの対応している規格
__cplusplusはC++の標準の仕様です。さらに,先の値は標準に定義されている値です。zxzy さんが書きました:調べてみると定義されているかどうかでC++か判断するのに使うものみたいなので
定義されている値が規格の日付?とは限らないみたいですね。
また、C++の標準仕様でなくコンパイラによってないものもあるみたいなので
絶対にこれでわかるというわけでもないのですね。
- ISO/IEC 14882:1998 16 Preprocessing directives / 16.8 Predefined macro names / Paragraph 1
__cplusplus The name __cplusplus is defined to the value 199711L when compiling a C++ translation unit.
- ISO/IEC 14882:2003 (INCITS/ISO/IEC 14882:2003) 16 Preprocessing directives / 16.8 Predefined macro names / Paragraph 1
__cplusplus The name __cplusplus is defined to the value 199711L when compiling a C++ translation unit.
- ISO/IEC 14882:2011 (INCITS/ISO/IEC 14882-2011) 16 Preprocessing directives / 16.8 Predefined macro names / Paragraph 1
__cplusplus The name __cplusplus is defined to the value 201103L when compiling a C++ translation unit.
Re: コンパイラの対応している規格
ということはURLのページがまちがっていたのですか。YuO さんが書きました: __cplusplusはC++の標準の仕様です。
ありがとうございました。