Заголовок C определяет в источнике C ++ причину ошибки компиляции

0

У меня есть библиотека, написанная не очень тщательным кодером, который включает следующий код в заголовочном файле C:

/* SomeCHeaderFile.h */
...
#define local static  
#define package       
#define global        

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

// SomeCPlusplusSourceFile.cpp
extern "C" {
   #include "SomeCHeaderFile.h"
}
...

компилятор дает следующую ошибку:

error: constructor cannot be static member function
error: 'std::locale::locale(const std::locale&)' cannot be overloaded
error: with 'std::locale::locale(const std::locale&)'

Я только говорю, что кодер не был дотошным, потому что он/он никогда не тестировал его в коде C++. Но я не знаю, почему это объясняется тем, почему это приводит к сбою сборки?

gcc версия 4.4.3 | ubuntu linux

  • 3
    Компилятор не "сбой", он дает вам прямое сообщение об ошибке. Обратите внимание, что static - это ключевое слово, и я думаю, что ваш программный код использует его неправильно. Похоже, вы создаете свои собственные ключевые слова, пожалуйста, не делайте этого.
  • 0
    Где код, где вы используете все эти #defines
Показать ещё 3 комментария
Теги:

2 ответа

2

Вы можете использовать файлы заголовков C в файлах CPP следующим образом:

extern "C" {

//Headers go here

}

Подробнее здесь:

В источнике C++, каков эффект extern "C"?

  • 0
    к сожалению, я не могу изменить файл заголовка, однако я забыл упомянуть, что я включаю заголовок, например, extern "C" { #include "SomeCHeaderFile.h" }
2

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню