Это только что возникло как вопрос, над которым я работал, поэтому я немного покопался и получил ответ от ExpertsExchange. Итак, я передаю вас Маньчжуну, задавшему первоначальный вопрос:
I have a project written in pure C which is to be used in embedded system. So, I use pure C to minimize the code size.
When I compile the project, I use the -ansi flag in order to make sure the code complies with the ANSI standard. However, the down side of using this ansi flag is that I am only allowed to use C styled comments (/*comments */). This is giving me a headache when I need to use nested comments.
So, my question is: what switches/flags can I use to allow me to use C++ styled comments (// comments) while keeping the ANSI checking enabled at the same time?
Что в значительной степени подводит итог и моему вопросу.





У C есть комментарии в стиле C++ уже почти десять лет, может, вам стоит обновить?
Я думаю, что мы используем gcc 3.x, поставляемый Wind River, для 64-битных встроенных систем.
Вот что он пытается сделать - перейти с C89 на C89 с комментариями в стиле C++. Учитывая, что он сказал, что целью является встроенная система, маловероятно, что у нее есть компилятор, совместимый с C99. Даже GCC не реализует C99.
Собственно оказывается gcc 2.9 !!
Если код нужно будет компилировать только на gcc версии 2.9+, нет особого смысла использовать флаг -ansi. Это мешает вам использовать вещи, которых может не хватать в других реализациях C89, но если это не является обязательным требованием, рассмотрите возможность использования режима по умолчанию, -std = g89, который разрешает //.
Вы можете использовать препроцессор комментариев -lang-c-C++, чтобы иметь комментарии как в режиме ANSI, так и в стиле C++.
gcc -Wp,-lang-c-c++-comments -c source.c
Это потому, что на самом деле это флаг препроцессора, поэтому вы вызываете его как: gcc -Wp, -lang-c-C++ - comments - а не непосредственно в командной строке. Однако, если вам действительно нужна переносимость ansi, у вас не должно быть комментариев в стиле С ++ ... :)
Я думаю, что ваш окончательный ответ.
Я считаю, что это больше не поддерживается. Я не могу заставить его работать в GCC 4.2 или 4.4 ни на Mac, ни на Linux. Я могу найти эту ссылку только в руководстве GCC CPP (возвращаясь к версии 2.9) "Примечание. Предыдущие версии cpp принимали параметр -lang, который выбирал и язык, и уровень соответствия стандартам. Этот параметр был удален, поскольку он конфликтует с Вариант -l ". Не могу найти замену.
В последних выпусках gcc -ansi задокументирован как то же самое, что и -std=c89. Новый синтаксис комментариев доступен только в стандарте C99, поэтому -std=c99 допускает это.
Существует также -std=gnu89, который аналогичен -std=c89, но позволяет использовать все расширения gcc (включая синтаксис комментариев в стиле C++, который был расширением GNU задолго до того, как он был добавлен в стандарт).
Также обратите внимание на флаг -pedantic, который может дать вам несколько полезных предупреждений.
Использованная литература:
-std = gnu89, вероятно, лучший выбор OP, -std = c99 имеет другие последствия, которые могут быть нежелательными.
-std = gnu89 работал у меня, я также искал расширенные комментарии с в основном семантикой ANSI.
документы говорит, что параметр -ansi эквивалентен -std = c90, а не c89 (просто для «правильности», хотя эти два снова кажутся синонимами?)
Если вы хотите использовать комментарии в стиле C++ просто потому, что хотите закомментировать блоки, и у вас возникла головная боль по поводу вложенности / * ... * /, вы можете использовать эту технику:
#if 0
... code ...
#endif
который на самом деле также будет работать.
Что-то не так с моим ответом? Прокомментируйте, если вы проголосовали против. Вы не можете вкладывать комментарии в стиле C, а комментарии в стиле C++ недопустимы в C++ 89. Этот #if 0 - практически единственный способ сделать это чисто, если вы хотите закомментировать код.
Это САМЫЙ ЛУЧШИЙ подход к этой проблеме, ИМХО.
Это не ответ на вопрос. Он только избегает этого.
@thomas Но я подозревал, что настоящая проблема вопросов заключалась в закомментировании кода. И поэтому я ответил. Мой ответ избегает вопроса, потому что он пытается решить предполагаемую проблему в корне, которая превосходит.
@ JohannesSchaub-litb И при этом ваш ответ не отвечает на вопрос, который каждый нажимает на эту ссылку, желая решить, и является гораздо менее общим. Так что нет, не лучше. Это помогает OP, но не помогает большинству людей, которые позже переходят по ссылке. В этом вся суть StackOverflow.
Если вы используете -ansi только для проверки совместимости, то проще всего будет подготовить сценарий или целевой файл makefile, который копирует полное исходное дерево в папку «ansi», при этом // удаляя комментарии. В псевдо-баше:
SRC=main.c blip.c blip.h
cp makefile ansi-src/
for F in $SRC do
# does not handle // in string literals or /**/ comments!
sed 's///.*//g' < $F >ansi-src/$F
done
cd ansi-src
make CFLAGS=-ansi
Если ваш SCC поддерживает это, это также можно превратить в ловушку фиксации, которая автоматически создает код на выделенной машине в режиме ANSI после каждой фиксации и отправляет вам отчет об этом по почте.
Остерегайтесь конечных обратных косых черт при исправлении ваших источников.
Боюсь, что создание сценария для какой-нибудь утилиты для перезаписи комментариев (как предлагает Лютер Блиссетт) может быть вашим единственным вариантом здесь. В современных версиях gcc, похоже, нет какого-либо флага компилятора или параметра CLI, который включал бы комментарии в стиле C++ при использовании -ansi или -std=c89.
Возможно, вы сможете получить то, что хотите, если подойдете к этому под другим углом. Возможно, вы сможете скомпилировать с -std=c99 и использовать флаги компилятора для запрещать специфичных для C99 расширений, которые вам не нужны (не зная больше о том, почему именно вам нужно соответствие ANSI, я не могу рекомендовать конкретные флаги).
Вы можете автоматически создать копию исходного кода с удаленными комментариями и использовать ее в своей программе.
Например. это выглядит многообещающе
Ответ на этот вопрос, получивший наибольшее количество голосов, больше не действителен. Мне бы хотелось увидеть решение - в моем случае это потому, что я пытаюсь обеспечить кроссплатформенную совместимость кода между Windows и Linux. Windows требует в основном кода, совместимого с ANSI, но имеет комментарии в стиле C++ в системных заголовках. И мои разработчики Windows воля используют комментарии в стиле C++, если я не помечу их как предупреждения (и это как ошибку). Включение комментариев C++ в GCC кажется самым простым ответом.