Как объявить встроенную функцию в C99 multi- file project?

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

я ожидаю, что необходимо действительно смотреть на один из:

  • LINQ-to-XML
  • XML (de) сериализация
  • платформа XPath/XQuery
  • XSLT

Объекта не имеет естественный , вписываются в этот сценарий.

25
задан jonrsharpe 18 February 2015 в 21:46
поделиться

3 ответа

К сожалению, не все компиляторы полностью соответствуют C99 в этой точке, даже если они утверждают, что они будут.

Соответствующий способ сделать это -

// header file. an inline declaration alone is
// not supposed to generate an external symbol
inline void toto(void) {
  // do something
}

// in one .c file, force the creation of an
// external symbol
extern inline void toto(void);

Более новые версии gcc, например, будут хорошо работать с этим.

Вы можете сойти с рук для других компиляторов (претендентов), определив что-то вроде

#ifdef PRETENDER
# define inlDec static
# define inlIns static
#else
# define inlDec 
# define inlIns extern
#endif
// header file. an inline declaration alone is
// not supposed to generate an external symbol
inlDec inline void toto(void) {
  // do something
}

// in one .c file, force the creation of an
// external symbol
inlIns inline void toto(void);

Редактировать:

компиляторы с поддержкой C99 (обычно опция -std=c99), что я знаю о

  • gcc (версии> = 4.3 IIRC) реализует правильную inline модель
  • pcc также правильно
  • ggc < 4.3 нужна специальная опция для реализации правильной модели, в противном случае они используют свою собственную модель, которая приводит к нескольким определенным символам, если вы не будете осторожны
  • icc просто испускает символы в каждой единице, если вы не будете особенно внимательны. Но эти символы являются «слабыми» символами, поэтому они не вызывают конфликта. Они просто взрывают твой код.
  • opencc, AFAIR, следует старой специфической для gcc модели
  • clang вообще не генерирует символы для функций inline, если у вас нет extern объявлений и , которые вы используете указатель на функцию в одном модуле компиляции.
  • tcc просто игнорирует ключевое слово inline
26
ответ дан 28 November 2019 в 21:41
поделиться

Если используется сам по себе, в C99 inline требуется, чтобы функция была определена в той же единице перевода, что и при ее использовании (поэтому, если вы используете ее в lib1.c, она должна быть определена в lib1.c).

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

См .: http://www.greenend.org.uk/rjk/2003/03/inline.html

.
4
ответ дан 28 November 2019 в 21:41
поделиться

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

Я думаю, что множественное определение может быть вызвано отсутствием функции «Включить охрану» в заголовочном файле.

Вы должны использовать что-то вроде этого в заголовке:

#ifndef HEADERNAME_H
#define HEADERNAME_H

void func()
{
    // do things...
}

#endif
-1
ответ дан 28 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: