LINUX.ORG.RU

extern «C»


0

0

extern "C"
{
    std::vector<int> *new_vector()
    {
        return new std::vector<int>;
    }
}

Правомерно ли сочетать extern "C" и настоящие плюсовые функции?

new_vector - это просто функция которая возвращает указатель на std_vector. Плюсовой или минусовой он станет только тогда, когда появится функция с таким же именем, но в другим возвращаемым типом, то есть: krum@krum-desktop:~/developmnet/c-c++$ cat test.cpp #include <vector> extern "C" { std::vector<int> *new_vector() { return new std::vector<int>; } void new_vector(){ }

}

krum@krum-desktop:~/developmnet/c-c++$ gcc -c test.cpp test.cpp: In function ‘void new_vector()’: test.cpp:8: ошибка: declaration of C function ‘void new_vector()’ conflicts with test.cpp:4: ошибка: previous declaration ‘std::vector<int, std::allocator<int> >* new_vector()’ here

Extern 'C' просто запрещает переименование функций, поэтому невозможен в C полиморфизм.

krum
()

new_vector - это просто функция которая возвращает указатель на std_vector. Плюсовой или минусовой он станет только тогда, когда появится функция с таким же именем, но в другим возвращаемым типом, то есть: krum@krum-desktop:~/developmnet/c-c++$ cat test.cpp #include <vector> extern "C" { std::vector<int> *new_vector() { return new std::vector<int>; } void new_vector(){ }

}

krum@krum-desktop:~/developmnet/c-c++$ gcc -c test.cpp test.cpp: In function ‘void new_vector()’: test.cpp:8: ошибка: declaration of C function ‘void new_vector()’ conflicts with test.cpp:4: ошибка: previous declaration ‘std::vector<int, std::allocator<int> >* new_vector()’ here

Extern 'C' просто запрещает переименование функций, поэтому невозможен в C полиморфизм.

krum
()

new_vector - это просто функция которая возвращает указатель на std_vector. Плюсовой или минусовой он станет только тогда, когда появится функция с таким же именем, но в другим возвращаемым типом, то есть:
krum@krum-desktop:~/developmnet/c-c++$ cat test.cpp 
#include <vector>
extern "C"
{
    std::vector<int> *new_vector()
    {
        return new std::vector<int>;
    }
    void new_vector(){
    }

}

krum@krum-desktop:~/developmnet/c-c++$ gcc -c test.cpp 
test.cpp: In function ‘void new_vector()’:
test.cpp:8: ошибка: declaration of C function ‘void new_vector()’ conflicts with
test.cpp:4: ошибка: previous declaration ‘std::vector<int, std::allocator<int> >* new_vector()’ here

Extern 'C' просто запрещает переименование функций, поэтому невозможен в C полиморфизм.

krum
()

В общем случае правомерно, но на функции extern "C" существуют определенные ограничения. В частности, такая функция может возвращать только примитивный тип. Точнее, она НЕ может возвращать по значению экземпляр класса, у которого есть деструктор. Простые указатели возвращать, разумеется, можно. Второе - это то, что компилятор может и не заметить (разные компиляторы ведут себя по-разному), - имя функции в бинаром модуле будет сформировано без учета сигнатуры функции. Более того, без учета namespace, в котором она объявлена. Поэтому обращаться с такими функциями надо как с полным ночным горшком - очень осторожно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.