Что касается основных компиляторов и int main(){} в C23
Моя программа:
int main(){}
В предстоящем C23 удалены непрототипные функции и функции «стиля K&R». Я понимаю, что C23 еще официально не выпущен, но текущее поведение gcc и clang меня смущает.
- Компиляция вышеизложенного с помощью gcc (магистраль):
никакой диагностики. - Компиляция вышеизложенного с помощью clang 16.0.0
-std=c2x -pedantic-errors -Wall -Wextra
:
нет диагностики. - Компиляция вышеизложенного с помощью clang 16.0.0
-pedantic-errors -Wall -Wextra
:ошибка: объявление функции без прототипа устарело во всех версиях C [-Werror,-Wstrict-prototypes]
Как мне понять это? Я могу понять, если gcc еще не реализовал это, поскольку C23 еще не выпущен, но почему clang выдает предупреждение, когда я не указываю-std=c2x
?
2 ответа
Похоже, я пропустил эту часть в C23 (проект N3096) 6.7.6.3/13:
Для декларатора функции без списка типов параметров: эффект такой же, как если бы он был объявлен со списком типов параметров, состоящим из ключевого слова
void
. Декларатор функции предоставляет прототип функции.
То есть C23 будет вести себя так же, как C++.
Когда вы используете clang 16.0.0 и не используете-std=c2x
по умолчанию используется версия, отличная от c2x (вероятно, c11, возможно, c17).
В этой версии ваша программа имеетfunction declaration without a prototype
, которыйdeprecated in all versions of C
(в том числе и тот).
В C2X убрали возможность объявления функций без прототипов. Каждое объявление функции имеет прототип. Таким образом, этот же код представляет собой объявление функции с прототипом без параметров.