コンパイラの対応している規格

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
zxzy

コンパイラの対応している規格

#1

投稿記事 by zxzy » 12年前

自分が使っているコンパイラがどの規格に対応なのか気になり
調べようと思ったのですが検索しても表示させる方法がわかりませんでした。

調べようとしているのは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: コンパイラの対応している規格

#2

投稿記事 by softya(ソフト屋) » 12年前

私が把握している情報です。

・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: コンパイラの対応している規格

#3

投稿記事 by bitter_fox » 12年前

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
gccについては以下などが参考になると思います。
http://gcc.gnu.org/c99status.html
http://gcc.gnu.org/projects/cxx0x.html
zxzy さんが書きました: 一応ためしてみたのは
1. // のコメント
2. printfのあとにint i;
3. void main(){}
4. for(int i=0;i<10;i++){}
で1,2はコンパイル通り、3,4はコンパイルエラーでした。
ということはC99はどれも対応していないということでしょうか。
そもそも、3はほとんどの環境で処理系依存じゃないですか?
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 回目 ]

たかぎ
記事: 328
登録日時: 13年前
住所: 大阪
連絡を取る:

Re: コンパイラの対応している規格

#4

投稿記事 by たかぎ » 12年前

どの規格に対応しているかとのことであれば...

__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: コンパイラの対応している規格

#5

投稿記事 by tk-xleader » 12年前

void main(){}ってC99で認められていましたっけ? 確か処理系定義のはずでは?

zxzy

Re: コンパイラの対応している規格

#6

投稿記事 by zxzy » 12年前

回答ありがとうございます。

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: コンパイラの対応している規格

#7

投稿記事 by softya(ソフト屋) » 12年前

ヤヤコシイので分けますが、

・C言語の対応
__STDC__に関しては、VC++は/TCでコンパイルしても無いので非標準処理系。
gcc4.3は__STDC__に関しては対応しているのでC90相当。-std=c99でC99相当。

・C++の対応。
もう少し調べてみます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

zxzy

Re: コンパイラの対応している規格

#8

投稿記事 by zxzy » 12年前

gccは__STDC__は通るので標準でした。
すみません。

zxzy

Re: コンパイラの対応している規格

#9

投稿記事 by zxzy » 12年前

たかぎ さんが書きました: __STDC__マクロが1で、__STDC_VERSION__マクロが201112Lならば、C11
で「C11」と検索してプログラム関係のことが出て来なかったので
C++11のことだろうと思ってC++もこの方法でいいのかと思ったのですが
「C11 C言語」と検索するとC言語でC11が出てきてC11というのがあるのを知りました。

なのでC++1xとかC++11で試したのはおかしかったですね。

たかぎ
記事: 328
登録日時: 13年前
住所: 大阪
連絡を取る:

Re: コンパイラの対応している規格

#10

投稿記事 by たかぎ » 12年前

softya(ソフト屋) さんが書きました:__STDC__に関しては、VC++は/TCでコンパイルしても無いので非標準処理系。
Visual C++では、/Zaオプションを付ければ__STDC__マクロが定義されます。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: コンパイラの対応している規格

#11

投稿記事 by YuO » 12年前

C++に関して,規格上では__cplusplusで確認することができます。
  • 199711L : ISO/IEC 14882:1998またはISO/IEC 14882:2003に準拠
  • 201103L : ISO/IEC 14882:2011に準拠
VC++ 2010は/Zaや/Zcオプションにかかわらず199711Lを返します。
なお,VC++ 2010の場合,/Zaを付けても__STDC_VERSION__は定義されません。また,C++モードでは,/Zaを付けても__STDC__は定義されません。
また,VC++ 2010のC++コンパイラの非標準事項については,Nonstandard Behaviorに書かれています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: コンパイラの対応している規格

#12

投稿記事 by softya(ソフト屋) » 12年前

すいません。/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

日ごろ互換問題に取り組んでいないとボロが出るなぁ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

zxzy

Re: コンパイラの対応している規格

#13

投稿記事 by zxzy » 12年前

たかぎ さんが書きました: 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

日ごろ互換問題に取り組んでいないとボロが出るなぁ。
そのようなオプションがあるのですね。
YuO さんが書きました:C++に関して,規格上では__cplusplusで確認することができます。
  • 199711L : ISO/IEC 14882:1998またはISO/IEC 14882:2003に準拠
  • 201103L : ISO/IEC 14882:2011に準拠
VC++ 2010は/Zaや/Zcオプションにかかわらず199711Lを返します。
__cplusplusで確認できました。
しかし、gccだと1と表示されました。
調べてみると定義されているかどうかでC++か判断するのに使うものみたいなので
定義されている値が規格の日付?とは限らないみたいですね。
また、C++の標準仕様でなくコンパイラによってないものもあるみたいなので
絶対にこれでわかるというわけでもないのですね。
http://www.geocities.jp/ky_webid/cpp/language/038.html

聞きたかった、自分の使っているコンパイラの対応状況と調べ方もわかったので
解決にしたいと思います。
回答してくれた方々ありがとうございました。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: コンパイラの対応している規格

#14

投稿記事 by YuO » 12年前

zxzy さんが書きました:調べてみると定義されているかどうかでC++か判断するのに使うものみたいなので
定義されている値が規格の日付?とは限らないみたいですね。
また、C++の標準仕様でなくコンパイラによってないものもあるみたいなので
絶対にこれでわかるというわけでもないのですね。
__cplusplusは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.
# 規格名の括弧内は実際に参照した規格。

zxzy

Re: コンパイラの対応している規格

#15

投稿記事 by zxzy » 12年前

YuO さんが書きました: __cplusplusはC++の標準の仕様です。
ということはURLのページがまちがっていたのですか。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る