Игнорировать недопустимые директивы в cpp - PullRequest
4 голосов
/ 13 июля 2011

Мы использовали некоторые директивы в нашем коде, которые недопустимы в современных стандартах. например. # COMMENT1

Раньше это работало в очень старой версии gcc (2.x). Я пытаюсь переместить его в новый gcc (4.x), однако я получаю такие ошибки, как: "ошибка: недопустимая директива предварительной обработки # COMMENT1"

Простое решение - изменить # на // в этих директивах, но мы не можем этого сделать из-за некоторых других зависимостей.

Вопрос в том, есть ли способ заставить cpp игнорировать эти недопустимые директивы?

Однако он должен интерпретировать действительные директивы так, как должен, например: #ifndef #define и т. Д.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 27 октября 2011

Вы не сказали, почему вы

не может изменить # на // в этих директивах

Полагаю, у вас есть несколько инструментов или скриптов в зависимости от них. Вы должны обновить их, чтобы они соответствовали текущему стандарту.

Возможно, вам может помочь более уникальный или невероятный суффикс, например, используйте //#COMMENT вместо #COMMENT

Но, по сути, вы просите более или менее стандартный соответствующий компилятор понять нестандартную и устарелую языковую функцию, а это по сути безнадежно.

В качестве альтернативы, вы можете исправить недавний исходный код GCC (например, GCC 4.6), чтобы следовать вашим требованиям, но я не думаю, что это очень хорошая идея (и даже возможность плагинов GCC 4.6 здесь не поможет , поскольку в препроцессоре для этого нет подключаемых плагинов).

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

0 голосов
/ 25 ноября 2014

В linux cpp есть флаг, чтобы попытаться эмулировать традиционный препроцессор в стиле C

со страницы руководства cpp:

-traditional-cpp 

   Try to imitate the behavior of old-fashioned C preprocessors, as opposed to ISO C preprocessors.
0 голосов
/ 30 октября 2012

Я получаю эти ошибки (g ++ 4.5.4), потому что ключевые слова препроцессора чувствительны к регистру.

#DEFINE _HEADER_FILE_
#ENDIF

завершится ошибкой, тогда как

#define _HEADER_FILE_
#endif

пройдет.Базиль сказал это хорошо, хотя.Стоит потратить время на ознакомление с более новым стандартом компилятора.

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