Среда — Microsoft Visual C++ 2015 и Windows 7.
Есть ли что-то особенное в inline extern "C"
функциях, определенных в заголовке? Я потребляю SDK, в котором один из заголовков содержит такого зверя. В моем приложении у меня есть одинокая TU (единица перевода), единственной задачей которой является включение вышеупомянутого заголовка. Это все. Ничего другого в нем нет. Если я покопаюсь в сгенерированном объектном файле, я увижу, что функция extern "C"
загружается. Это вызывает у меня некоторые нежелательные побочные эффекты (я пока не упомяну их, так как это может просто отвлечь от основной проблемы).
Почему это произошло? В клиентском коде нет ничего (помните, что мой единственный TU пуст, за исключением точки входа main()
и этого заголовка), что вызывает это.
ОБНОВЛЕНИЕ с небольшим фрагментом, который мог бы лучше объяснить, с чем я столкнулся:
Вот что происходит на самом деле:
FooObj.h
FooObj::FooObj() { }
FooObj::~FooObj() { CallIntoAnotherC_API(); }
SDKHeader.h
#include <FooObj.h>
extern "C" inline void SomeFunc(void* user_data)
{
A* obj = static_cast<A*>(user_data);
obj->CallAnotherFunc(FooObj(33));
}
Мой файл.cpp
#include "SDKHeader.h"
int main() { return 0; }
Компиляция MyFile.cpp в исполняемый файл завершается сбоем, поскольку компоновщик жалуется, что CallIntoAnotherC_API является неразрешенным внешним.
inline extern "C"
? - person Шах   schedule 29.05.2016inline extern "C"
функциях, определенных в заголовке? Одним словом, нет. Почему это произошло? Что именно? Неуказанные нежелательные побочные эффекты? - person n. 1.8e9-where's-my-share m.   schedule 29.05.2016inline
безstatic
илиextern
когда-либо полезным в C99. Он охватывает проблему с точки зрения системы C. См. также внешний встроенный, который может быть еще более уместным. По сути, в C один исходный файл может содержатьextern inline …function definition…
, и этот файл будет содержать не встроенную функцию для встроенной функции. - person Jonathan Leffler   schedule 29.05.2016extern "C"
может что-то изменить. Он может просто создать фактическую функцию со связью в стиле C (это означает, что имя не "искажено", чтобы обеспечить вам безопасную для типов связь, как это обычно делает C++), которую можно использовать там, где функцияinline
не может быть встроена. Но почему это в файле, содержащем толькоint main() { return 0; }
, более загадочно. Непонятно (мне), какие глобальные переменные связываются/инициализируются до запускаmain()
или уничтожаются после его завершения. - person Jonathan Leffler   schedule 29.05.2016SomeFunc
явно для возникновения этой ситуации? - person ForeverLearning   schedule 29.05.2016FooObj.h
должен быть еще какой-то код — либо напрямую, либо включенный. Наличие встроенных определений конструктора и деструктора не будет работать, если не будет определения класса, с которым может работать компилятор. В определении класса могут быть некоторые детали, которые объясняют происходящее, или какой-то другой код в заголовке, который это объясняет. Хорошо создать MCVE (минимально воспроизводимый пример). Я боюсь, что вы немного слишком минималистичны в (первом обновлении) вопроса, отказавшись от «полных» и «поддающихся проверке» аспектов MCVE. - person Jonathan Leffler   schedule 29.05.2016CallIntoAnotherC_API()
предоставляется компоновщику? - person M.M   schedule 30.05.2016inline
в заголовке, который будет использоваться совместно между C и C++, потому что он имеет разную семантику в каждом из C++, ISO C и GNU C. (не знаю, что с ним делает компилятор C MSVC) - person M.M   schedule 30.05.2016