Зачем определять функцию в исходном файле, а затем объявлять ее в другой перед использованием ее ссылки? - PullRequest
2 голосов
/ 03 апреля 2019

Я нашел следующий шаблон в источнике DOOM, и я не уверен, что с ним делать.

Файл определения .c

Объявление и использование .c файла

enemy.c

// A nice definition, but there is no corresponding header file, kind of weird
void A_Pain (mobj_t* actor)
{
    if (actor->info->painsound)
    S_StartSound (actor, actor->info->painsound);   
}

info.c

// Now it's redeclared, but without a parameter?
void A_Pain();
// ...
state_t states[NUMSTATES] = {
// ...
    {SPR_PLAY,6,4,{A_Pain},S_PLAY,0,0}, // S_PLAY_PAIN2
// ...
}

Почему заголовочный файл не будет использоваться,когда остальная часть кода использует их?Есть ли преимущество у этого метода?

Зачем объявлять функции в другом исходном файле с разными сигнатурами?

Ответы [ 3 ]

3 голосов
/ 03 апреля 2019

Это не очень хорошая практика, я думаю. Но исходя из моего понимания стандарта C, когда вы объявляете функцию, подобную void A_Pain();, эта функция может принимать любое количество параметров, что отличается от C ++. Так что в C вам нужно использовать void A_Pain(void);, чтобы сказать, что у него нет параметра.

Но в C ++ void A_Pain(); означает, что он не принимает параметров.

0 голосов
/ 03 апреля 2019

Почему не используется заголовочный файл?

Это не имеет большого значения, заголовочные файлы в любом случае являются просто текстовыми. имеет смысл помещать объявления в заголовочные файлы, особенно если они используются в нескольких местах, но это не требуется . Пока каждый модуль компиляции согласен с тем, что означает название, все будет работать нормально.

Зачем объявлять функции в другом исходном файле с разными сигнатурами?

Они не имеют разных подписей; если бы они сделали, была бы проблема. Но объявление в info.c имеет список параметров no . Это допускается до тех пор, пока «список параметров [в определении] не должен иметь терминатора эллипса, а тип каждого параметра должен быть совместим с типом, который является результатом повышения аргумента по умолчанию» (N1256 6.7 .5.3, которая, вероятно, является неправильной версией спецификации для приложения к Doom, но это не имеет значения). Другими словами, если функция объявляется без подписи, число и типы ее параметров будут определяться исходя из того, как она вызывается. Пока этот вывод правильный , у вас есть действующая программа, которая будет работать правильно. Это просто старомодно, и из-за отсутствия ясности его немного сложнее поддерживать.

0 голосов
/ 03 апреля 2019

В C объявление T f() не объявляет функцию f, возвращающую T и принимающую нулевые параметры; он объявляет функцию f, возвращающую T и принимающую неопределенное количество параметров.

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

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