Как включить системный заголовок C вместо системного заголовка C ++ с тем же именем в программе C ++? - PullRequest
1 голос
/ 26 ноября 2011

В моей системе Mac OS X имеется несколько разных версий файла заголовка complex.h, и они несовместимы.

  • /usr/include/complex.h определяет реализацию C99 _Complex чисел,
  • /usr/include/c++/4.2.1/backward/complex.h - это тонкая оболочка вокруг заголовка C ++ без .h, которая определяет реализацию C ++ std::complex чисел.

Моя проблема в том, что у меня есть библиотека C, скомпилированная с использованием комплексных чисел C99, и мне нужно связать свою программу на C ++ с ней. Тем не менее, он включает ссылки на включаемый файл <complex.h>, и при компиляции моей программы g ++ вместо этого берет заголовок обратной совместимости C ++, и весь ад проваливается.

Я пытался передать флаг -I/usr/include в g ++, но это не помогло.

Как заставить g ++ использовать заголовок C вместо заголовка C ++ при включении <complex.h>?

Ответы [ 4 ]

1 голос
/ 04 января 2014

Я решил, что должен вернуться и принять ответ.

В самом верхнем комментарии написано "Просто не делай этого".Я закончил тем, что не делал этого.

1 голос
/ 26 ноября 2011

Это не совсем оптимальное решение, но если вы просто хотите убедиться, что получаете нужную версию заголовка без изменения кода, вы можете попробовать использовать комбинацию -nostdinc и -nostdinc++ с * 1003. * флаг. Если я правильно понимаю документацию, это должно помешать gcc просмотреть стандартный список файлов системных заголовков и вместо этого отложить до тех, которые поставляются с флагом -I. Это должно перевесить решение Os X автоматически включить каталог обратной совместимости в список поиска заголовка.

Однако существует вероятность, что с этими опциями вы не сможете скомпилировать. В GCC предусмотрены случаи, когда вы предоставляете каталог с флагом -I, который уже присутствует в списке поиска системного заголовка по умолчанию (он игнорирует посторонний флаг -I). Надеюсь, он достаточно умен, чтобы заметить, что список поиска системы был очищен (с помощью флагов -nostdinc), что позволило добавить свойство -I/usr/include.

.
0 голосов
/ 26 ноября 2011

Оберните заголовки в вашем коде внешним блоком, т.е.

  extern "C"{
  // include your c header here
  }

Я думаю, что все получится.Извините за форматирование кода выше, эта функциональность не работает на iPhone, очевидно.

0 голосов
/ 26 ноября 2011

Предполагая, что ни одна из функций из библиотеки C, которые используются кодом C ++, не имеют параметров или возвращаемых типов _Complex, вы можете изменить файл заголовка C, окружив директиву #include <complex.h>, а также что-либо еще взаголовок, который использует _Complex, с директивами #ifndef __cplusplus / #endif, так что код C ++ не увидит его и не будет смущен.С другой стороны, если вы абсолютно не можете изменить заголовок C, вы можете скопировать прототипы функций и все остальное, что используется кодом C ++, в новый заголовок, включенный в код C ++.

EDIT

Если вы действительно настроены на устранение неоднозначности заголовков, вы можете попробовать #include "/usr/include/complex.h" вместо простого #include <complex.h>, но с использованием абсолютного пути к стандартному заголовку библиотеки, как этоХорошая практика и, вероятно, не переносимая.

...