2012-12-31 34 views
8

GCCが匿名構造体のメンバを使用することを可能にするオプション、-fms-extensions、持っている:GCCの-fms-extensionsを使うのは悪い考えですか?

struct a { 
    int x; 
} 

struct b { 
    int y; 
    struct a; 
} 

をこれは単にb.xを使用してstruct bx要素のアクセスを可能にします。これは非常に便利ですが、GCCでエミュレートされているMicrosoftの拡張機能のようです。

このオプションを使用すると、コードの移植性が低下するか、使用するのが「安全」と考えられますか?

+0

IMHO、それほど有用ではありません。コードをgccに依存しないようにする。だから答えは:はい。 – Jack

答えて

13

あなたは互換性のために探しているなら、厳しい、ずさんなコンパイラオプションを設定することをお勧めことはありません - 多くのポータブル

4

フラグ-fms-拡張子は「で使用されるいくつかの非標準的な構文を受け入れるために使用されていますMicrosoftのヘッダーファイルです。 " GCCはさまざまな規格に基づいて作成されているので強力です。したがって、適切な環境で使用することは悪い考えです。

+1

(もちろん、新しいコードを書いているのであれば、別のコンパイラをターゲットにしたいかもしれません!) –

+1

絶対に*使用する必要がない場合は、*恐ろしい*のアイディアです。オプションが必要な場合はそこにあります。 – paulsm4

6

標準(C11)の2011年版では、匿名の構造体および共用体と呼ばれる機能がCに追加されていることを考慮すると、この機能を使用することはあまり好ましくありません。 MSコンパイラがそれをサポートしていれば、GCCと "GNU C"互換コンパイラが要求されればそれをサポートし、現代標準に準拠した新しいコンパイラがそれをサポートします。

+1

その場合でも、gccでこのサポートを有効にする_nitpicky_方法は、gccのドキュメントhttp://gcc.gnu.orgによると、 '-std = c11'または' -std = iso9899:2011'と言うことになります。 /onlinedocs/gcc/Standards.html) - 特殊なコンパイラフラグではありません。 –

+0

残念ながら、古いgccのバージョンは '-std = c11'を認識しません(リリースされた時点でC11 *が存在しないため)。しかし、引き続き匿名の構造体/共用体を拡張として受け入れます。だから、あなたのソフトウェアが非常に最近のgccに依存しないようにするには、古いものでも動作させるフラグでコンパイルするのが簡単であることを確認する必要があります。 –

関連する問題