GCC错误消息:尝试使用招“TARGET_I386”

问题描述:

我修改的Qemu的源代码,创建这样GCC错误消息:尝试使用招“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的源文件被使用。

此错误信息的含义是什么?

更新:

正如马提亚维尔纳提到的,这些定义不应当被用于目标独立代码。这些毒物标识在poison.h

定义显然标识符已被标记为中毒

GCC Documentation

的#pragma GCC毒

有时候,还有就是你想从完全删除的标识符你的程序,并确保它永远不会爬回来。为了强制执行此操作,可以使用此附注毒化标识符。 #pragma GCC中毒后面跟着一个要毒害的标识符列表。如果这些标识符中的任何一个出现在指令之后的源中的任何位置,这是一个严重错误。

例如,

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

将产生错误。

如果中毒标识符作为在标识符中毒之前定义的宏的扩展的一部分出现,它不会导致错误。这可以让你中毒标识符,而不用担心定义使用它的宏的系统头文件。

例如,

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

不会产生错误。

构建目标独立代码时,不应使用QEMU中的毒药标识符。

+0

这个答案比我的好,它解释了错误发生的原因,而不是如何解释。 – 2012-02-27 14:48:18