我正在修改Qemu的源代码,创建了这样的文件
#if defined(TARGET_I386)
/* some defines */
#elif defined(TARGET_ARM)
/* some other defines */
#endif
Run Code Online (Sandbox Code Playgroud)
然后包含此文件vl.c,并且gcc报告以下错误消息:
error: attempt to use poisoned "TARGET_I386"
error: attempt to use poisoned "TARGET_ARM"
Run Code Online (Sandbox Code Playgroud)
TARGET_I386 在另一个头文件中定义,并在其他qemu的源文件中使用.
这个错误信息的含义是什么?
更新:
正如Matthias Werner所提到的,这些定义不应该用于目标独立代码.这些毒药识别定义于poison.h
r_a*_*kog 13
显然,标识符已被标记为中毒
来自GCC文档
#pragma GCC毒药
有时,有一个标识符要从程序中完全删除,并确保它永远不会重新进入.为了强制执行此操作,您可以使用此pragma中毒标识符.#pragma GCC毒药后面跟着一个毒药标识符列表.如果任何这些标识符出现在指令之后的源中的任何位置,则这是一个硬错误.
例如,
#pragma GCC poison printf sprintf fprintf
sprintf(some_string, "hello");
Run Code Online (Sandbox Code Playgroud)
会产生错误.
如果中毒标识符出现在标识符中毒之前定义的宏扩展的一部分,则不会导致错误.这使您可以中毒标识符,而无需担心定义使用它的宏的系统头.
例如,
#define strrchr rindex
#pragma GCC poison rindex
strrchr(some_string, 'h');
Run Code Online (Sandbox Code Playgroud)
不会产生错误.