【问题标题】:GCC error message: attempt to use poisoned "TARGET_I386"GCC 错误消息:尝试使用中毒的“TARGET_I386”
【发布时间】:2012-02-27 07:53:24
【问题描述】:

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

【问题讨论】:

    标签: c gcc


    【解决方案1】:

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

    来自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');
    

    不会产生错误。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这个答案比我的更好,因为它解释了错误发生的原因而不是如何发生。
      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2016-11-24
      • 2021-04-02
      • 1970-01-01
      • 2013-02-14
      • 2014-12-31
      相关资源
      最近更新 更多