我正在修改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
答案 0 :(得分:12)
显然标识符已被标记为中毒
#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中的毒药标识符。