Как это работает на C или C++?Использование extern для включения файлов в C или C++
extern "C" {
#include <unistd.h>
#include <fd_config.h>
#include <ut_trace.h>
#include <sys/stat.h>
#include <sys/types.h>
}
Как это работает на C или C++?Использование extern для включения файлов в C или C++
extern "C" {
#include <unistd.h>
#include <fd_config.h>
#include <ut_trace.h>
#include <sys/stat.h>
#include <sys/types.h>
}
Он не будет работать, вам нужно добавить cplusplus препроцессор ...
#ifdef __cplusplus
extern "C" {
#endif
// your code
#ifdef __cplusplus
}
#endif
EDIT:
В C++ имя будет рассматриваться как в C, которые означают, что не будет никакого имени магии. Это позволяет сделать разницу между двумя различными функциями C++ с разными типами аргументов/числом или другим пространством имен в библиотеке (для библиотеки libname.so, libname.a). Если имя подогнаны, программа C не сможет распознать его
eg:
int myfction()
void myfunction(int)
void myfunction(int, char)
C library: myfction
C++ library: int_myction (it depend on your compiler)
C++ library: int_myction_int (it depend on your compiler)
C++ library: int_myction_int_char (it depend on your compiler)
// ... which is not allowed in C program
стандарт C++ не определяет, как составители должны назвать символы в их объектных файлов (например, Foo::bar()
может закончиться как __clsFoo_fncBar
или некоторые gobbledygook). Стандарт C делает это, и он почти всегда отличается от того, как это делают компиляторы C++ (C не должен иметь дело с классами, пространствами имен, перегрузкой и т. Д.).
В результате, когда вы связываетесь с объектным файлом, который был выдан компилятором C, вы должны сообщить своему компилятору C++ искать символы с именами, соответствующими стандарту C. Вы по сути ставите его в режим «C». Это то, что делает "C"
часть extern "C"
.
(В качестве альтернативы, вы могли бы быть также объявления функций и переменных, которые могут быть использованы с помощью внешнего объектного файла C. В этом случае, это означает, что экспорт этих символов в C путь.)
Каждый C++ компилятор должен поддерживать внешняя связь «С». Код в таком блоке может быть устаревшим кодом, написанным на C, для определенной функциональности, которая требуется для текущей программы.
Как это реализовано, в основном зависит от компилятора. Однако я слышал, что многие компиляторы отключили имя, управляющее и изменяющее соглашение о вызове.
Если у вашего проекта есть исходные файлы на C и C++, и вам нужно построить в целом (файлы C вызывают некоторые функции в файлах на C++), поэтому нам необходимо защитить вызовы и символы функции файла C, объявив как в файлах на C++ по
ехЬегп "с" { /символы, используемые в файлах гр/ uint8 GetCurrentthreadState (HANDLE ThreadId)
}
Затем на C++ компилятор генерирует выходной сигнал, который компиляции такая же, как и для C-complier для вышеперечисленных объявленных функций и символов. Таким образом, при компоновке времени компилятор может легко связывать символы C и C++ с какой-либо ошибкой ссылки.
Так что мое мнение не нужно для того, чтобы дать #ifdef __cplusplus чек на компиляции. Потому что нам нужно защитить символы в файлах C++ правильно? Также файлы C++ могут быть скомпилированы только компилятором C++?
/renjith g
Защитники #ifdef __cplusplus полезны, если у вас есть объявления в файле заголовка, могут быть включены как в программы C, так и на C++. Это происходит очень часто, когда у вас смешанный проект C/C++ или вы пишете библиотеку. –
нет, совсем нет необходимости проверять макрос #ifdef __cplusplus в файлах заголовков, если вы используете собственный компилятор C++. Для использования extern «C» {} достаточно. /renjith g –
Не должно работать в C.'extern" C "- это вещь C++; он сообщает компилятору относиться ко всему, что следует, как к C, чтобы избежать изменения имени. – GManNickG
Этот код используется в C++. вы хотите знать, как этот код компилируется gcc? –
Да, я хочу знать, как это работает в C++ –