group-telegram.com/cxx95/28
Create:
Last Update:
Last Update:
#compiler
extern "C" - на что в действительности это влияет?
Примерно 9 лет назад я пробовал писать игры на C++. Для скриптов я использовал Lua. Он поставлялся в виде статической библиотеки (lua.lib
для Windows) и header-файлов. Так как Lua написан на C и lua.lib
собран компилятором C, то чтобы все слинковалось, надо было подключать хидеры так:
extern "C" {В то время я не понимал, почему надо делать именно так. Конечно, спустя много времени стало понятно, что дело в перегрузке методов. Перегруженные методы надо как-то отличать между собой.
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
В языке C перегрузки методов нет, и в объектный файл попадает "чистое" название метода. В C++ попадает "запутанное", это называется name mangling:
void hello(int, char) -> hello (в С)
void hello(int, char) -> _Z1helloic (в C++)
extern "C"
нужен как раз для того, чтобы методы и переменные, объявленные внутри него, имели "чистое" имя (код на godbolt)Однако что в остальном? Сам код внутри
extern "C"
компилируется как C++ или как C? Мнение "C это подмножество C++" ошибочно: два языка развиваются независимо. В C есть то, чего нет в C++, например VLA.Сам Стандарт показывает примеры, из которых видно, что код скомпилируется по правилам C++: [dcl.link] (там есть классы).
Погрепав исходники компилятора, можно точно сказать, что компиляция внутри
extern "C"
происходит по правилам C++, и аффектится только условие "надо манглить или нет": исходник Clang.Вывод из этого такой: хидеры библиотеки на C должны быть достаточно простыми, чтобы в C и в C++ они компилировались одинаково.
BY C++95
Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260
Share with your friend now:
group-telegram.com/cxx95/28