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

cyf*_*cyf 6 c gcc

我正在修改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)

不会产生错误.


Mat*_*ias 5

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