2010-02-15 3 views
1

Как это работает на 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> 
} 
+5

Не должно работать в C.'extern" C "- это вещь C++; он сообщает компилятору относиться ко всему, что следует, как к C, чтобы избежать изменения имени. – GManNickG

+1

Этот код используется в C++. вы хотите знать, как этот код компилируется gcc? –

+0

Да, я хочу знать, как это работает в C++ –

ответ

1

Он не будет работать, вам нужно добавить 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 
5

стандарт C++ не определяет, как составители должны назвать символы в их объектных файлов (например, Foo::bar() может закончиться как __clsFoo_fncBar или некоторые gobbledygook). Стандарт C делает это, и он почти всегда отличается от того, как это делают компиляторы C++ (C не должен иметь дело с классами, пространствами имен, перегрузкой и т. Д.).

В результате, когда вы связываетесь с объектным файлом, который был выдан компилятором C, вы должны сообщить своему компилятору C++ искать символы с именами, соответствующими стандарту C. Вы по сути ставите его в режим «C». Это то, что делает "C" часть extern "C".

(В качестве альтернативы, вы могли бы быть также объявления функций и переменных, которые могут быть использованы с помощью внешнего объектного файла C. В этом случае, это означает, что экспорт этих символов в C путь.)

0

Каждый C++ компилятор должен поддерживать внешняя связь «С». Код в таком блоке может быть устаревшим кодом, написанным на C, для определенной функциональности, которая требуется для текущей программы.

Как это реализовано, в основном зависит от компилятора. Однако я слышал, что многие компиляторы отключили имя, управляющее и изменяющее соглашение о вызове.

2

Если у вашего проекта есть исходные файлы на C и C++, и вам нужно построить в целом (файлы C вызывают некоторые функции в файлах на C++), поэтому нам необходимо защитить вызовы и символы функции файла C, объявив как в файлах на C++ по

ехЬегп "с" { /символы, используемые в файлах гр/ uint8 GetCurrentthreadState (HANDLE ThreadId)

}

Затем на C++ компилятор генерирует выходной сигнал, который компиляции такая же, как и для C-complier для вышеперечисленных объявленных функций и символов. Таким образом, при компоновке времени компилятор может легко связывать символы C и C++ с какой-либо ошибкой ссылки.

Так что мое мнение не нужно для того, чтобы дать #ifdef __cplusplus чек на компиляции. Потому что нам нужно защитить символы в файлах C++ правильно? Также файлы C++ могут быть скомпилированы только компилятором C++?

/renjith g

+1

Защитники #ifdef __cplusplus полезны, если у вас есть объявления в файле заголовка, могут быть включены как в программы C, так и на C++. Это происходит очень часто, когда у вас смешанный проект C/C++ или вы пишете библиотеку. –

+0

нет, совсем нет необходимости проверять макрос #ifdef __cplusplus в файлах заголовков, если вы используете собственный компилятор C++. Для использования extern «C» {} достаточно. /renjith g –