Совместимы ли большинство системных заголовочных файлов linux / API C ++?
Сегодня я пытался сделать что-то вроде этого:
#include <iostream>
extern "C" {
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
}
int main() {
//socket exercise
}
Тогда мне сказал друг:
даже не нужно это делать ( дополнительный extern "C" {} ) в большинстве случаев, так как они являются системными заголовками.
сначала попробуйте, а потом переживайте.
не предполагайте, что системные заголовки несовместимы.
Вы можете на самом деле сломать вещи, делая это, поскольку у некоторых есть только C ++ экспорт
Но тогда я спросил:
Если я включу функцию библиотеки C и скомпилирую без ошибок. Гарантирует ли это, что библиотека, которую я включил, совместима с C ++, и тогда я могу безопасно ее использовать?
Ответ:
Нет, проверки нет.
Так что попробуйте сначала -> без ошибок -> не гарантирует совместимость с C ++.
Тогда что мне делать, например, с системными заголовками Linux? Потому что я не могу просто обернуть системные заголовки дополнительным оператором extern "C" {}
(«Я мог бы на самом деле все испортить, потому что некоторые экспортируют только C ++»).
Поэтому мне нужно проверить, есть ли __BEGIN_DECLS
и __END_DECLS
MARCOS определены в системном заголовочном файле для каждого заголовочного файла, который я использую? Если нет, то мне нужно обернуть его extern "C" {}
? В противном случае я просто включаю это напрямую?
К вашему сведению, __BEGIN_DECLS
и __END_DECLS
определены как:
# define __BEGIN_DECLS extern "C" {
# define __END_DECLS }