手始めに、あなたの問題について少し話しましょう。システムが一方のシステムでもう一方のシステムよりもエラーを発生させる最も可能性の高い原因は、コードが同一ではないことだと思います。いくつかのツールまたはdiff
コマンドを使用してこれを確認し、コードベースで発生した微妙な変更を探すことができます。通常、そのエラータイプで問題が発生した場合、次のような問題が発生します。
typedef struct Foo* Fooptr;
ヘッダーファイルで、次に:
typedef struct Foo
{
int bar;
} *Fooptr;
ソースファイル内。つまり、typedefをソースにドロップするだけで、問題ないはずです。探すべきもの。
これが問題である場合、問題gcc
を解決するための2番目のオプションは、同じコンピューター上に複数のバージョンのgccを配置し、オプションgcc
を介して実行する正確なバージョンを指定することです。-v
したがって、Fedora18マシンで4.1.2を試してみるのは良い考えかもしれません。
別の注意点として、この-v
オプションを使用するが、実行するバージョンを指定しないgcc
場合、コンパイルの段階を実行するために実行されるコマンドが(stderr出力で)取得されます。これは、何が起こっているのか、各マシンで何が起こっているのかに大きな違いがあるかどうかを確認するのに役立ちます。
では、質問に移りましょう。はい、次の「バージョンX」でコンパイルするためのフラグがありgcc
ます。最初に、__VERSION__
事前定義されたマクロconst char *
があります。これにより、バージョン番号が返されます。これは非常に便利ですが、gccのドキュメントに次のように記載されています。
特定の形式のコンテンツに依存するべきではありませんが、少なくともリリース番号が含まれていると期待できます。
それにもかかわらず、私は通常、これからの出力の1つの形式しか見ていません。これは"4.6.3"
、私のバージョンがである場合のようなものgcc
です4.6.3-1ubuntu5
。
gcc
これで、コードの一部が特定のバージョンのエラーを引き起こすことがわかっている(または疑われる)場合は__GNUC__
、、、__GNUC_MINOR__
および__GNUC_PATCHLEVEL__
事前定義されたマクロを使用して自分自身を「保護」でき
ます。これを使って:
#if __GNC__ == 3
printf(“Hello version 3.x.x\n”);
#elif __GNC__ == 4
printf(“Hello version 4.x.x\n”);
#endif
したがって、バージョンが4.6.3である上記のシステムでは、「Helloversion4.xx」というメッセージが表示されます。次に、より高度になり、subversionsも確認できます。
#if __GNUC__ > 3 || \
(__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
(__GNUC_MINOR__ == 2 && \
__GNUC_PATCHLEVEL__ > 0))
printf(“I’m a gcc greater than 3.2.0\n”);
#endif
または、独自のマクロを使用したよりクリーンなバージョン:
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#if GCC_VERSION > 30200
printf(“I’m a gcc greater than 3.2.0\n”);
#endif
gcc
のバージョンが異なるとエラーが異なるかどうかについての質問に答えるにgcc
は、リリースごとにさらに多くのことが行われ、場合によっては状況が変わるため、コンパイラのバージョンが異なると違いがわかります。最善の策は、使用している2つのバージョン間の各バージョンのリリースノートを確認することです。(4.1から4.7へ)。
使用しているターゲットアーキテクチャがわからないため、各ドキュメントの特定のセクションを確認してください。しかし、あなたは本当にとを見てみたいと思います。"Build system improvements"
それら"Incompatible changes to the build system"
はまた、レビューするのに便利なCコードに固有のセクションを作成します。