GCC错误消息:尝试使用中毒的“TARGET_I386”

时间:2012-02-27 07:53:24

标签: c gcc

我正在修改Qemu的源代码,创建了一个像这样的文件

#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的源文件中使用。

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

更新

如Matthias Werner所述,这些定义不应用于目标独立代码。这些毒药标识在poison.h

中定义

2 个答案:

答案 0 :(得分:12)

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

来自GCC Documentation

#pragma GCC毒药

有时候,有一个标识符要从程序中完全删除,并确保它永远不会重新进入。为了强制执行此操作,您可以使用此pragma中毒标识符。 #pragma GCC毒药后面跟着一个毒药标识符列表。如果任何这些标识符出现在指令之后的源中的任何位置,那么这是一个很难的错误。

例如,

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

会产生错误。

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

例如,

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

不会产生错误。

答案 1 :(得分:5)

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