Избегайте предупреждения: ссылка на find_rule без ссылки - PullRequest
2 голосов
/ 11 января 2012

Чтобы получить больше совместимости между flex и другой версией lex, мы должны добавить опцию -l в команду flex.Одной из этих несовместимостей является yylineno (глобальная переменная для хранения номера строки).Хотя есть два способа активировать эту опцию:

  • с использованием опции% yylineno

  • или опции -l

У меня всегда есть такие предупреждения:

предупреждение C4102: 'find_rule': метка без ссылки

любая помощь, пожалуйста, чтобы избежать этого предупреждения!

Ответы [ 2 ]

1 голос
/ 11 января 2012

Поскольку вы говорите, что код, запускающий предупреждение, генерируется автоматически и не может контролироваться вами, единственный способ избавиться от предупреждения - это подавить его только для этого кода. У вас есть два варианта.

Первый вариант - изменить настройки компилятора для конкретного файла (не самая лучшая поддержка).

Вариант 2 - #include файл .c в другой файл и завернуть его в #pragma warning:

//WrapperGateFile.c
#pragma warning(push)
#pragma warning(disable: 4102)

#include "ProblematicFile.c"

#pragma warning(pop)

и (важно!) Либо не включают проблемный файл .c в проект, либо исключают исходный файл .c из сборки (свойство «Исключено из сборки»), чтобы он не компилировался и не связывался дважды.

1 голос
/ 11 января 2012

На основании описания от C4102 причина - ссылка на ссылку:

int f()
{
    test: // This will produce C4102

    return 1;
}

int main()
{
    f();
    return 0;
}

Чтобы предотвратить предупреждение, вы можете удалить неиспользованную метку или отключить предупреждение, либо изменив источник:

#pragma warning(push)
#pragma warning(disable: 4102)
void f()
{
    test: // This will produce C4102

    return;
}
#pragma warning(pop)

или указав /wd4102 в качестве параметра компилятора.

Когда вы утверждаете, что это сгенерированный код, который вы не хотите менять, переключатель компилятора является единственным вариантом (я могу думать).

...