2009年08月10日
Visual C++ 2008 での C99 対応
C99 の規格が成立してから 10 年が経つわけですが、VC++ 2008 では ANSI C89 (ISO C90) までしか対応しておらず、C99 は未対応のようです。
次期の VC++ 2010 でも状況は変わらないようです。(ベータ版のマニュアルですが。)
http://msdn.microsoft.com/ja-jp/library/02y9a5ye(VS.100).aspx
やはり C# や .NET をプッシュする Microsoft 的には、OS の根幹を支える C++ はともかく、いまさら C はどうでも良いという扱いなのでしょうか。KMCでは、現在でも C はバリバリの現役なので、少し寂しいところです。
ちなみに VC++ にも、GCC と同様に独自の拡張機能が含まれており(ただし、GNU C のような派手な (?) 拡張は存在せず、独自の解釈的な拡張が多いようです)、/Za で ANSI C/C++ と互換性の無い機能を無効にできるそうです。(GCC の -ansi -pedantic 相当。)
「/Za、/Ze (言語拡張機能の無効化)」
http://msdn.microsoft.com/ja-jp/library/0k0w269d.aspx
「Microsoft C/C++ の拡張機能」
http://msdn.microsoft.com/ja-jp/library/34h23df8.aspx
VC++ の拡張機能を有効にする /Ze オプションは、VC++ 2008 で付けると「cl : コマンド ライン warning D9035 : オプション 'Ze' の使用は現在推奨されていません。今後のバージョンからは削除されます。」という警告が出ます。
次期の VC++ 2010 でも状況は変わらないようです。(ベータ版のマニュアルですが。)
http://msdn.microsoft.com/ja-jp/library/02y9a5ye(VS.100).aspx
やはり C# や .NET をプッシュする Microsoft 的には、OS の根幹を支える C++ はともかく、いまさら C はどうでも良いという扱いなのでしょうか。KMCでは、現在でも C はバリバリの現役なので、少し寂しいところです。
ちなみに VC++ にも、GCC と同様に独自の拡張機能が含まれており(ただし、GNU C のような派手な (?) 拡張は存在せず、独自の解釈的な拡張が多いようです)、/Za で ANSI C/C++ と互換性の無い機能を無効にできるそうです。(GCC の -ansi -pedantic 相当。)
「/Za、/Ze (言語拡張機能の無効化)」
http://msdn.microsoft.com/ja-jp/library/0k0w269d.aspx
「Microsoft C/C++ の拡張機能」
http://msdn.microsoft.com/ja-jp/library/34h23df8.aspx
VC++ の拡張機能を有効にする /Ze オプションは、VC++ 2008 で付けると「cl : コマンド ライン warning D9035 : オプション 'Ze' の使用は現在推奨されていません。今後のバージョンからは削除されます。」という警告が出ます。
コメント一覧
1. Posted by 通りすがり 2009年08月13日 12:46
指示付きの初期化子と複合リテラルはC++にも持ち込んで欲しいぐらい
2. Posted by 若槻 2009年08月17日 18:55
C++1x (次期 C++ 規格) では、C99 の Compound Literal の影響を受けたと思われる Initializer List が入るようです。
参考 ja.wikipedia:C++0x
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2100.pdf
http://d.hatena.ne.jp/faith_and_brave/20070921/1190380809
ならば、確かにスパースに配列を初期化することができる Designated Initializers も欲しいところですよね。コンストラクタやデフォルト引数で、ある程度は代用できますが…
参考 ja.wikipedia:C++0x
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2100.pdf
http://d.hatena.ne.jp/faith_and_brave/20070921/1190380809
ならば、確かにスパースに配列を初期化することができる Designated Initializers も欲しいところですよね。コンストラクタやデフォルト引数で、ある程度は代用できますが…
3. Posted by Egtra 2009年08月23日 03:53
http://blogs.msdn.com/somasegar/archive/2008/11/21/c-enhancements-in-vs-2010.aspx
ここのコメントに興味深いものがあります。
> Arjun Bijanki [MSFT] said:
>
> @z
>
> > Why not to add C99 support fr all people who do cross platform development.
>
> The simple reason is that we haven't seen that much demand as compared to the massive requests we receive for TR1, C++0x, etc. I don't foresee us implementing C99 in its entirety, but we will take a close look at requests for specific C99 features (especially ones that integrate well with C++.)
>
> Apart from <stdint.h> and %zd, are there other C99 features you'd really like to have?
TR1やC++0xなどと比べC99を要望する声は見かけないのがC99に対応しない理由だと言うのです(かなり怪しい英文の理解ですが)。
実際、可変長マクロなど個別に一部のC99の機能を実装している場合があるんですよね。そのつもりがあったかどうかはともかく/Zeの「可変長配列を構造体および共用体の最後のフィールドとして指定する。」もC99では認められています。
個人的には、VS2010はstdint.hとcstdintが入るのが嬉しいです。C99ではなくC++0x対応の一部でしょうが。
ここのコメントに興味深いものがあります。
> Arjun Bijanki [MSFT] said:
>
> @z
>
> > Why not to add C99 support fr all people who do cross platform development.
>
> The simple reason is that we haven't seen that much demand as compared to the massive requests we receive for TR1, C++0x, etc. I don't foresee us implementing C99 in its entirety, but we will take a close look at requests for specific C99 features (especially ones that integrate well with C++.)
>
> Apart from <stdint.h> and %zd, are there other C99 features you'd really like to have?
TR1やC++0xなどと比べC99を要望する声は見かけないのがC99に対応しない理由だと言うのです(かなり怪しい英文の理解ですが)。
実際、可変長マクロなど個別に一部のC99の機能を実装している場合があるんですよね。そのつもりがあったかどうかはともかく/Zeの「可変長配列を構造体および共用体の最後のフィールドとして指定する。」もC99では認められています。
個人的には、VS2010はstdint.hとcstdintが入るのが嬉しいです。C99ではなくC++0x対応の一部でしょうが。
4. Posted by 若槻 2009年08月24日 09:25
なるほど、そこのブログで、Arjun Bijanki 氏は、以前から同じような主張をされているようですね。
http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx
(via http://twitter.com/shelarcy/status/2862981704 )
ビジネスですから、優先度ごとに対応を変える、本当に欲しいなら主張してくれ、という MS の主張は全くもって正しいと思います。
stdint.h 入るのですか。これはうれしいですね。コメントありがとうございます。
http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx
(via http://twitter.com/shelarcy/status/2862981704 )
ビジネスですから、優先度ごとに対応を変える、本当に欲しいなら主張してくれ、という MS の主張は全くもって正しいと思います。
stdint.h 入るのですか。これはうれしいですね。コメントありがとうございます。