Это действительный код C, но не допустимый код C ++? - PullRequest
9 голосов
/ 30 апреля 2010

В какой-то библиотеке я использую (написано на С) ее

StorePGM(image, width, height, filename)
char *image;
int width, height;
char *filename;
{
  // something something
}

Все функции определены таким образом. Я никогда не видел такие определения функций в моей жизни. Кажется, они действительны для MSVC, но когда я компилирую их как C ++, это дает ошибки.

Что это? какая-то старая версия C?

Ответы [ 3 ]

16 голосов
/ 30 апреля 2010

Да. K & R, предварительно стандартный C. Избегайте его использования.

5 голосов
/ 08 сентября 2011

До стандарта ANSI C 1989 года у C не было прототипов (объявлений функций, определяющих типы параметров); эти объявления и определения в старом стиле были всем, что было доступно.

В 1989 году стандарт ANSI C (который по сути стал стандартом ISO C 1990 года) представил прототипы. Если я правильно помню, идея на самом деле пришла из C ++ (который еще не был стандартизирован в то время). Объявления и определения в старом стиле оставались законными, поэтому старый код можно было скомпилировать. Стандарт 1989 года также гласил, что декларации старого стиля «устарели», что означает, что они могут быть удалены в будущей версии стандарта.

Стандарт ISO C 1999 года, который (официально) заменил стандарт 1990 года, оставил это в покое; объявления и определения в старом стиле все еще допустимы, и все соответствующие компиляторы должны их поддерживать (хотя они могут предупреждать о них, поскольку они могут предупреждать обо всем остальном).

Начиная с последней версии C201X (большой PDF), этот все еще не изменился. Объявления и определения функций старого стиля по-прежнему являются обязательной частью языка, и все соответствующие компиляторы должны их поддерживать. (Лично я считаю это неудачным.)

C ++, с другой стороны, никогда (?) Никогда не поддерживал ничего, кроме прототипов, в качестве объявлений функций; Страуструп не особо заботился о сохранении совместимости со старым кодом Си.

Но если вам не нужно поддерживать очень старый код и / или использовать очень старые компиляторы, нет веских причин использовать объявления или определения функций старого стиля.

Обратите внимание, что, по крайней мере, в C, это определение:

int main() {
    /* ... */
}

на самом деле это определение старого стиля. Это верно для C ++, где это прототип, указывающий, что main не имеет параметров, но в C это должно быть

int main(void) {
    /* ... */
}

(C ++ также принимает эту форму для совместимости с C - но к тому времени, когда вы пишете main, вы уже должны были решить, какой язык вы используете.)

0 голосов
/ 30 апреля 2010

Да, это стиль K & R. (Kernighan & Ritchie являются изобретателями C). См. Также http://www.lysator.liu.se/c/bwk-tutor.html для примеров этого стиля до ANSI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...