C99 'extern inline' в библиотеке, используемой C ++ 11 [duplicate]

Для localhost / wampserver 3 мы можем установить sql-mode = user_mode, чтобы удалить эту ошибку:

click on wamp icon -> MySql -> MySql Setting -> sql-mode -> user_mode

затем перезапустить wamp или apache

3
задан gibbss 18 January 2013 в 05:23
поделиться

3 ответа

Об этом сообщается gcc: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56066 после обсуждения, начинающегося здесь: http: // gcc. gnu.org/ml/gcc-help/2013-01/msg00152.html

В linux gcc испускает слабые символы для встроенных функций и сильный символ для внешнего встроенного. При времени соединения слабые отбрасываются в пользу сильного. Видимо, на окнах все обрабатывается по-разному. У меня нет опыта работы с окнами, поэтому я не могу сказать, что там происходит.

0
ответ дан Marc Glisse 29 August 2018 в 02:33
поделиться

Использование static с inline должно исправить проблему с несколькими определениями. Даже для компилятора, который не может самостоятельно решить, что он не должен генерировать символы для функций inline'd.

0
ответ дан kerim 29 August 2018 в 02:33
поделиться

Стандартные состояния C ++ 11 (3.2.3), которые:

Каждая программа должна содержать ровно одно определение каждой нестрочной функции или переменной, которая является odr-используемой в этой программе ; не требуется диагностика. Определение может явно отображаться в программе, оно может быть найдено в стандартной или определяемой пользователем библиотеке или (если необходимо), оно неявно определено (см. 12.1, 12.4 и 12.8). Встроенная функция должна быть определена в каждой единицы перевода, в которой она используется odr.

C ++ также знает об extern + inline, но понимает это как «Встроенная функция с внешней связью должна иметь один и тот же адрес во всех единицах трансляции "(7.1.2)

Таким образом, extern + inline, поскольку вы используете его, является чистой функцией C99, и вам должно быть достаточно сделать что-то вроде:

#ifdef __cplusplus
#define C99_PROTOTYPE(x)
#else
#define C99_PROTOTYPE(x) x
#endif

И ссылайтесь в buffer.c:

// buffer.c
C99_PROTOTYPE(extern inline bool has_remaining(void * obj);)

встроенная функция в заголовке для C ++ 11 в порядке и должна отлично работать без прототипов в стиле C99.

0
ответ дан Konstantin Vladimirov 29 August 2018 в 02:33
поделиться
Другие вопросы по тегам:

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