Зачем предотвращать искажение имен файлов C - PullRequest
0 голосов
/ 15 января 2019

Примечание: мой вопрос, насколько мне известно, я не пытаюсь решить конкретную проблему.

Я искал использование библиотеки C в проекте CPP для предотвращения искажения имени компилятора:

#ifdef __cplusplus
extern "C" {
#endif

1- но я также прочитал, что компилятор C ++ не будет искажать файлы .c. так зачем?

2 - если у вас была библиотека с +500 c файлами. (заголовки + c файлами). как вы автоматически добавляете этот Extern "C" в них? есть ли инструмент, который автоматизирует этот процесс?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

ответ "apple apple", как правило, неправильный.

Компилятор C ++ по определению компилирует C ++. Некоторые компиляторы являются компиляторами C / C ++ или поддерживают даже больше языков (GCC приходит на ум). Те могут использовать расширение файла в качестве подсказки, но вы также можете выбрать один конкретный язык. Например. gcc -x c++ выбирает компилятор Gnu C ++, даже для файлов .c.

Что касается существующей библиотеки C, так как у вас есть исходные файлы, которые вы не должны предотвращать искажение имен. Скомпилируйте библиотеку с тем же компилятором, что и ваше приложение. Это делает название искажения идентичным. Инструменты не нужны.

Я также подозреваю, что вы можете подумать, что extern "C" означает "компилировать как код C". Это не тот случай. Это означает: «скомпилируйте этот код C ++ так, чтобы его внешний интерфейс был совместим с C». Вы по-прежнему получаете все возможности C ++ изнутри.

0 голосов
/ 15 января 2019

[Дополнительный ответ]

Обычно нет необходимости редактировать исходный файл для добавления extern "C". Есть более простая альтернатива, которая оставляет файл нетронутым:

// Foo.cpp
extern "C" {
   #include "Foo.c"
}

Вы говорите своему компилятору C ++ компилировать Foo.cpp. Сначала он запустит препроцессор, и он вставит Foo.c в блок extern "C" { }.

0 голосов
/ 15 января 2019
  1. c++ компилятор может не выполнять манипулирование именами на .c файлах, но он определенно будет искажать те, которые включены в .cpp файлы, поэтому в заголовочных файлах он необходим
  2. Вы можете просто использовать extern "C"{ file content here }, это легко сделать во многих инструментах.

Я пишу сценарий cmd (.bat) для вас

ПРЕДУПРЕЖДЕНИЕ : это перезапишет существующие файлы, сделайте резервную копию!

@ECHO OFF
for /R %%f in (*.c,*.h) do (
   @echo extern "C" { > temp
   @echo. >> temp
   @type %%f >> temp
   @echo. >> temp   
   @echo } >> temp
   @type temp > %%f
   @echo processed %%f
)
...