Как включить комментарии в стиле C++ в gcc, оставив включенным ANSI?

Это только что возникло как вопрос, над которым я работал, поэтому я немного покопался и получил ответ от 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?

Что в значительной степени подводит итог и моему вопросу.

Ответ на этот вопрос, получивший наибольшее количество голосов, больше не действителен. Мне бы хотелось увидеть решение - в моем случае это потому, что я пытаюсь обеспечить кроссплатформенную совместимость кода между Windows и Linux. Windows требует в основном кода, совместимого с ANSI, но имеет комментарии в стиле C++ в системных заголовках. И мои разработчики Windows воля используют комментарии в стиле C++, если я не помечу их как предупреждения (и это как ошибку). Включение комментариев C++ в GCC кажется самым простым ответом.

mbauman 22.07.2010 02:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
19
1
14 930
7

Ответы 7

У C есть комментарии в стиле C++ уже почти десять лет, может, вам стоит обновить?

Я думаю, что мы используем gcc 3.x, поставляемый Wind River, для 64-битных встроенных систем.

graham.reeds 10.11.2008 13:10

Вот что он пытается сделать - перейти с C89 на C89 с комментариями в стиле C++. Учитывая, что он сказал, что целью является встроенная система, маловероятно, что у нее есть компилятор, совместимый с C99. Даже GCC не реализует C99.

Steve Jessop 10.11.2008 14:20

Собственно оказывается gcc 2.9 !!

graham.reeds 10.11.2008 17:12

Если код нужно будет компилировать только на gcc версии 2.9+, нет особого смысла использовать флаг -ansi. Это мешает вам использовать вещи, которых может не хватать в других реализациях C89, но если это не является обязательным требованием, рассмотрите возможность использования режима по умолчанию, -std = g89, который разрешает //.

Steve Jessop 14.11.2008 16:42

Вы можете использовать препроцессор комментариев -lang-c-C++, чтобы иметь комментарии как в режиме ANSI, так и в стиле C++.

gcc -Wp,-lang-c-c++-comments -c source.c

Это потому, что на самом деле это флаг препроцессора, поэтому вы вызываете его как: gcc -Wp, -lang-c-C++ - comments - а не непосредственно в командной строке. Однако, если вам действительно нужна переносимость ansi, у вас не должно быть комментариев в стиле С ++ ... :)

Jason Coco 10.11.2008 13:20

Я думаю, что ваш окончательный ответ.

Johannes Schaub - litb 10.11.2008 13:47

Я считаю, что это больше не поддерживается. Я не могу заставить его работать в GCC 4.2 или 4.4 ни на Mac, ни на Linux. Я могу найти эту ссылку только в руководстве GCC CPP (возвращаясь к версии 2.9) "Примечание. Предыдущие версии cpp принимали параметр -lang, который выбирал и язык, и уровень соответствия стандартам. Этот параметр был удален, поскольку он конфликтует с Вариант -l ". Не могу найти замену.

mbauman 22.07.2010 01:19

В последних выпусках gcc -ansi задокументирован как то же самое, что и -std=c89. Новый синтаксис комментариев доступен только в стандарте C99, поэтому -std=c99 допускает это.

Существует также -std=gnu89, который аналогичен -std=c89, но позволяет использовать все расширения gcc (включая синтаксис комментариев в стиле C++, который был расширением GNU задолго до того, как он был добавлен в стандарт).

Также обратите внимание на флаг -pedantic, который может дать вам несколько полезных предупреждений.

Использованная литература:

-std = gnu89, вероятно, лучший выбор OP, -std = c99 имеет другие последствия, которые могут быть нежелательными.

zwol 26.07.2010 23:59

-std = gnu89 работал у меня, я также искал расширенные комментарии с в основном семантикой ANSI.

davenpcj 05.12.2013 10:38

документы говорит, что параметр -ansi эквивалентен -std = c90, а не c89 (просто для «правильности», хотя эти два снова кажутся синонимами?)

mozzbozz 01.10.2014 16:25

Если вы хотите использовать комментарии в стиле C++ просто потому, что хотите закомментировать блоки, и у вас возникла головная боль по поводу вложенности / * ... * /, вы можете использовать эту технику:

#if 0
... code ...
#endif

который на самом деле также будет работать.

Что-то не так с моим ответом? Прокомментируйте, если вы проголосовали против. Вы не можете вкладывать комментарии в стиле C, а комментарии в стиле C++ недопустимы в C++ 89. Этот #if 0 - практически единственный способ сделать это чисто, если вы хотите закомментировать код.

Johannes Schaub - litb 26.08.2009 19:54

Это САМЫЙ ЛУЧШИЙ подход к этой проблеме, ИМХО.

Spidey 29.06.2012 19:45

Это не ответ на вопрос. Он только избегает этого.

Thomas 08.01.2014 05:55

@thomas Но я подозревал, что настоящая проблема вопросов заключалась в закомментировании кода. И поэтому я ответил. Мой ответ избегает вопроса, потому что он пытается решить предполагаемую проблему в корне, которая превосходит.

Johannes Schaub - litb 08.01.2014 13:57

@ JohannesSchaub-litb И при этом ваш ответ не отвечает на вопрос, который каждый нажимает на эту ссылку, желая решить, и является гораздо менее общим. Так что нет, не лучше. Это помогает OP, но не помогает большинству людей, которые позже переходят по ссылке. В этом вся суть StackOverflow.

Thomas 08.01.2014 14:08

Если вы используете -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 после каждой фиксации и отправляет вам отчет об этом по почте.

Остерегайтесь конечных обратных косых черт при исправлении ваших источников.

Ruslan 26.08.2016 08:48

Боюсь, что создание сценария для какой-нибудь утилиты для перезаписи комментариев (как предлагает Лютер Блиссетт) может быть вашим единственным вариантом здесь. В современных версиях gcc, похоже, нет какого-либо флага компилятора или параметра CLI, который включал бы комментарии в стиле C++ при использовании -ansi или -std=c89.

Возможно, вы сможете получить то, что хотите, если подойдете к этому под другим углом. Возможно, вы сможете скомпилировать с -std=c99 и использовать флаги компилятора для запрещать специфичных для C99 расширений, которые вам не нужны (не зная больше о том, почему именно вам нужно соответствие ANSI, я не могу рекомендовать конкретные флаги).

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

Например. это выглядит многообещающе

Другие вопросы по теме