C / C ++ struct вопрос - PullRequest
       4

C / C ++ struct вопрос

4 голосов
/ 20 августа 2011

Предположим, у вас есть файл .cpp (то есть скомпилированный с использованием компилятора C ++, такого как MSVC). В этом файле вы определяете struct следующим образом:

struct Pixel
{
   float x, y;
};

В том же файле у вас есть строка кода, которая будет вызывать функцию C, для которой требуется C struct, равный Pixel. Если вы напишите:

Pixel my_pixel
// set my_pixel to something
c_func(&my_pixel);

это будет работать? Я имею в виду, что компилятор C ++ создаст объект my_pixel, но передаст его функции, скомпилированной как код C (у меня есть только библиотека этой библиотеки).

Ответы [ 2 ]

5 голосов
/ 20 августа 2011

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

1 голос
/ 22 августа 2011

Причина, по которой Дэвид Шцварц говорит, что вам нужен блок extern "C", заключается в том, что без внешнего блока "C" компилятор "искажает" имя функции C, которую вы вызываете, в точке, которую вы вызываете.Если вы вызываете функцию C, а не функцию C ++, определение функции в вашей библиотеке не будет иметь искаженного имени, поэтому ваш исполняемый файл не сможет связать.

Это то, что вы хотите, если функция, которую вы вызываетенаписан на C ++, поскольку искажение имени допускает перегрузку имени функции.Типы каждого из параметров функции компактно кодируются в искаженном имени функции.

Изначально искажение имени было предоставлено в C ++, чтобы позволить объектным файлам C ++ связываться с унаследованными компоновщиками, вместо того чтобы предоставлять C ++специализированный компоновщик, который явно поддерживает перегруженные функции.

C не допускает перегрузки имен функций, поэтому имена функций C никогда не искажаются.Чтобы предоставить прототип на C ++ для одной функции C, вы должны сделать следующее:

extern "C" Foo( int theInt );

Если у вас есть весь заголовочный файл, полный прототипов функций C, и вы хотите #include этот заголовок из источника C ++, заключите#include во внешнем блоке C

extern "C" {
    #include "Foo.h"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...