Что касается основных компиляторов и 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 убрали возможность объявления функций без прототипов. Каждое объявление функции имеет прототип. Таким образом, этот же код представляет собой объявление функции с прототипом без параметров.

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