Я недавно включил -pedantic
опция на gcc и теперь у меня есть приблизительно две или три страницы "ISO C90, запрещает смешанное объявление и код" предупреждения.
Моя цель с этим проектом состоит в том, чтобы быть в состоянии развернуть его в какой-либо основной системе с компилятором C, таким образом, я понимаю, что не было бы мудро предположить, что C99 будет поддерживаться везде, но это даже стоит моего времени для обращения к этим предупреждениям?
Есть ли все еще системы там с компиляторами C, которые не поддерживают смешанное объявление и код?
Ну, а вы собирались писать свой код на C89/90 или на C99?
Поскольку это единственное предупреждение, которое вас, похоже, беспокоит, очевидно, что ваш код на самом деле был написан на C89/90. Если это действительно так и вы планируете придерживаться C89/90, то я бы придерживался строгого C89/90 и перенес бы все объявления в начало блока.
Если, с другой стороны, вы готовы и планируете перейти на С99, то "неуместные" декларации больше не являются проблемой. Тогда вашей основной заботой станет поддержка платформы/компилятора. Компиляторы MS Visual Studio C - это компиляторы C89/90. Это проблема? (Учитывая, что GCC доступен на Windows платформах)
.IIRC, Visual C++ не допускает смешанных объявлений и кода в режиме C.
Visual C++ вообще отстает в поддержке C99. Однако в последнее время ситуация, возможно, улучшилась, и скомпилировать Ваш код в режиме Си++ все равно можно.
.Я не уверен, что изменил бы его.
Однако, если вы все-таки решите, что хотите, это довольно просто (так что, может быть, вам стоит); Просто сделайте все свои заявления сразу после начала блока кода. Если вам абсолютно необходимо определить их позже, используйте другой вложенный блок кода.
.С-компилятор Visual Studio не допускает смешивания деклараций и кода. Вероятно, Microsoft никогда не добавит полную поддержку C99 в Visual Studio; в Windows-мире C не достаточно важен.
. Если вы хотите быть -педантиком
по поводу стандарта C99, добавьте опцию -std=c99
.
Лично мне нравится старый несмешанный стиль, потому что он облегчает визуальный аудит того, какие типы памяти использует функция, и решение о том, что может потребоваться free()-ing перед возвращением.
.Я бы исключил это конкретное предупреждение, так как перемешивание кода и деклараций не является широко поддерживаемой функцией.
На самом деле у меня та же проблема с библиотекой, которую я пишу. Я использую вариадические макросы, но они, кажется, более поддерживаются.
Чтобы убедиться, что моя библиотека будет действительно пригодна для использования другими, я собираюсь протестировать ее с помощью как можно большего количества компиляторов. Я уже сделал это с Visual C++ Express и Pelles C и попробую другие ( по крайней мере, OpenWatcom, Mars C и lcc-Win32).
К сожалению, SourceForge больше не предоставляет ферму компиляторов, как это было несколько лет назад, и я не могу протестировать ее на коммерческих компиляторах Unix.
.