2013-07-31 2 views
3

Im используя ++ DLL C для моего проекта C# DLL имеет класс, внутри которого создается и уничтожается внешними функциями, такими как:оператор «Новый» работает в экстерном «C»

class myClass 
{ 
    int N; 
    public: 
     //some elements and some functions 

     myClass(int n) 
     { 
      N=n; 
     } 
}; 

__declspec(dllexport) myClass * builderF(int n) 
{ 

     return new myClass(n); 

} 

__declspec(dllexport) void destroyerF(myClass * c) 
{ 

     delete c; 

} 

и они находятся в extern "C" {} body.

Как компилятор позволяет мне использовать функции C++ - это «C» пространство? Разве это не только для кода C? Это проверено и работает (Ive начал создавать opencl-обертку для C#). Раньше я использовал только чистые коды C.

+0

Может быть полезно: [В источнике C++, каков эффект extern «C»?] (Http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect- of-extern-c) –

+0

Таким образом, связь полностью отличается от компиляции? Поэтому он просто компилируется как код на C++. –

+0

Это не только компилируется, но действительно работает? Я имею в виду функцию 'destroyerF'? o.O – lapk

ответ

9

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

+0

Хорошо, теперь это более чище. Спасибо. Принимая в считанные минуты. Должен ли каждый компилятор давать точно такое же поведение? –

+2

Следуя ответам Джеймса, единственное, что вы не можете сделать в «extern» C «-блоке - это функции перегрузки; перегрузка управляется с помощью обработки имени, которая, как и адреса Джеймса, отсутствует в этом блоке. – mah

+0

+1: Обратите внимание, что некоторые компиляторы могут быть включены в C-режим с помощью директив, но это не так. –

Смежные вопросы