Предварительное объявление встроенных функций

У меня есть заголовочный файл, который будет содержать большое количество (30+) встроенных функций.

Вместо того, чтобы читатель прокручивал или искал определение (реализация) встроенной функции, я хотел бы иметь раздел forward Declaration, в котором указывается объявление функции с комментариями, описывающими функцию. Этот раздел позволит читателю узнать, как использовать функцию или найти функцию, не прокручивая вниз до реализации.

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

Каков синтаксис предварительного объявления автономной функции?

{Это относится к C99 и C++}

К вашему сведению, я использую компилятор IAR Workbench C, настроенный на использование C99.


person Thomas Matthews    schedule 16.02.2012    source источник


Ответы (2)


Не иначе, как не встроенная функция:

void func();       // "forward" declaration

// ...

inline void func() // definition
{
    // impl
}

Обычно шаблон, используемый для «скрытия» определений от потребителя библиотеки, состоит в том, чтобы поместить объявления в один заголовок (a.h), а определения во второй заголовок (a_def.h), а затем сделать первый #include вторым (защиты включения опущены для краткости) :

// a.h
void func();
#include "a_def.h"

// a_def.h
inline void func()
{
    // impl
}

Потребитель библиотеки просто #include <a.h>.

person ildjarn    schedule 16.02.2012
comment
Как скрыть определения, если они находятся всего в одном файле? Есть ли разница, если у меня есть определения в том же файле под объявлениями? - person Fabian; 06.10.2016
comment
@Fabian: Hide не просто так в кавычках. ;-] Нет, вообще никакой разницы. - person ildjarn; 06.10.2016
comment
Это неверно для C99. Использование невстроенного объявления вместе со встроенным определением приведет к созданию видимого извне символа в каждой единице перевода, в которую включен заголовок, что приведет к сбою связывания с ошибкой повторяющегося символа. - person a3f; 17.02.2017
comment
@a3f: хорошо замечено; этот ответ для С++. (И именно поэтому глупо отмечать несколько языков в вопросе.) - person ildjarn; 17.02.2017

Вам не нужно "объявлять вперед" его (термин, который обычно применяется только к типам, поскольку мы обычно определяем их в том же месте, где мы их сначала объявляем).

Просто объявите это, как обычно:

#include <iostream>

void foo();            // Declaration

inline void foo() {    // Defining declaration
   std::cout << "!";
}

// ---------------------------------------------

int main() {
   foo();              // Output: foo()
}

Демо.

person Lightness Races in Orbit    schedule 16.02.2012
comment
Возможно, я не совсем ясно выразился в своем вопросе, есть ли проблемы с использованием предварительного объявления для встроенной функции? - person Thomas Matthews; 16.02.2012
comment
@ThomasMatthews: Вы просили синтаксис. Но мой ответ также уже охватывает ваш новый вопрос. И, как говорится, не называйте это предварительным объявлением. - person Lightness Races in Orbit; 16.02.2012
comment
На самом деле в C++ вообще нет форвардного объявления термина. Это просто декларация. - person Kerrek SB; 16.02.2012
comment
Почему я не получаю голосов, тогда как ответ, опубликованный позже, получает 5? :( - person Lightness Races in Orbit; 16.02.2012
comment
@KerrekSB: название стандартной главы 27.3 не согласуется с вами (и с тем, кто проголосовал за ваш неправильный комментарий). Чтобы избавить вас от поиска, он называется предварительными объявлениями и перечисляет предварительные объявления в iostreams. Надеюсь, это поможет. - person Lightness Races in Orbit; 16.02.2012
comment
@LightnessRacesinOrbit: Ссылка на <utility> в объявлении forward не считается! :-) Хорошо, а если серьезно: нормативны ли названия глав? В любом случае, мне придется переговорить с этим стандартом... Я не люблю, когда с ним не соглашаются :-) - person Kerrek SB; 16.02.2012
comment
@KerrekSB: есть также 9.1/2: [..] Объявление, состоящее исключительно из идентификатора ключа класса, является либо повторным объявлением имени в текущей области, либо упреждающим объявлением идентификатора в качестве имени класса. Он вводит имя класса в текущую область. [..] Теперь это норма. - person Lightness Races in Orbit; 16.02.2012