2012-02-27 7 views
6

を使用しようとする試みは、このGCCエラーメッセージ:私はQEMUのソースコードを変更してい毒「TARGET_I386」

#if defined(TARGET_I386) 
    /* some defines */ 
#elif defined(TARGET_ARM) 
    /* some other defines */ 
#endif 

このファイルのようなファイルを作成したが、その後vl.c、とgcc報告し、次のエラーメッセージに含まれています:

error: attempt to use poisoned "TARGET_I386" 
error: attempt to use poisoned "TARGET_ARM" 

TARGET_I386は、別のヘッダファイルで定義され、他のqemuのソースファイルで使用されます。

このエラーメッセージの意味はなんですか?

更新:

マティアスヴェルナーによって述べたように、これらの定義は、ターゲットに依存しないコードのために使用すべきではありません。これらの毒を識別は

GCC Documentationから

を毒としてどうやら識別子がマークされているpoison.h

答えて

11

で定義されているの#pragma GCC毒時には

、あなたから完全に削除する識別子がありますこのプラグマで識別子をポイズングすることができます。 #pragma GCC poisonの後には、毒の識別子のリストが続きます。これらの識別子のいずれかがディレクティブの後にソースのどこに現れても、それはハードエラーです。エラーが発生します。例えば

#pragma GCC poison printf sprintf fprintf 
sprintf(some_string, "hello"); 

識別子が被毒される前に定義されたマクロの展開の一部として被毒された識別子が表示された場合、エラーは発生しません。これにより、識別子を使用するマクロを定義しているシステムヘッダについて心配することなく、識別子に害を与えることができます。

例えば、

#define strrchr rindex 
#pragma GCC poison rindex 
strrchr(some_string, 'h'); 

はエラーを生成しないであろう。

4

ターゲット独立コードを構築するときに、QEMUのポイズン識別子を使用すべきではありません。

+0

この回答は、なぜエラーが発生しているのか、どのように起こっているのか説明できないという意味で、私のものよりも優れています。 –

関連する問題