Сообщение об ошибке GCC: попытка использовать отравленный "TARGET_I386" - PullRequest
6 голосов
/ 27 февраля 2012

Я изменяю исходный код 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.

Что означает это сообщение об ошибке?

Обновление:

Как уже упоминал Матиас Вернер, эти определения не должны использоваться для кода, независимого от цели. Эти идентификаторы ядов определены в poison.h

Ответы [ 2 ]

12 голосов
/ 27 февраля 2012

Видимо идентификаторы были помечены как отравленные

Из Документация GCC

# Прагма GCC яд

Иногда существует идентификатор, который вы хотите полностью удалить из своей программы, и убедитесь, что он никогда не закрадывается обратно. Для обеспечения этого вы можете отравить идентификатор этой прагмой. #pragma В GCC за ядом следует список идентификаторов для отравления. Если какой-либо из этих идентификаторов появляется где-либо в источнике после директивы, это серьезная ошибка.

Например,

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

выдаст ошибку.

Если отравленный идентификатор появляется как часть расширения макроса, который был определен до того, как идентификатор был отравлен, это не приведет к ошибке. Это позволяет отравить идентификатор, не беспокоясь о системных заголовках, определяющих макросы, которые его используют.

Например,

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

не выдаст ошибку.

5 голосов
/ 27 февраля 2012

Идентификаторы ядов в QEMU не должны использоваться при создании целевого независимого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...