Объявления функций и неразрешенный внешний
Я смотрю на огромную старую программу на C и преобразую ее в C++ (для которой я новичок).
Существует множество сложных взломов препроцессоров, связанных с тем фактом, что программа должна работать на разных платформах в разных конфигурациях.
В одном файле (назовите это file1.c
) Я звоню functionA()
,
И в другом файле (назовите это file2.c
) У меня есть определение functionA()
,
К сожалению, точный тип функции определяется набором макросов, созданных изумительным количеством способов.
Сейчас компоновщик жалуется, что:
functionA - это неразрешенный внешний символ.
Я подозреваю, что проблема в том, что прототип, как видно из file1.c, немного отличается от истинного определения функции, как это видно из file2.c.
Из-за несоответствия между _cdecl
а также fastcall
и между с и без __forceinline
,
Есть ли какой-то способ показать , что именно компилятор считает тип functionA()
как видно по file1.c
в отличие от file2.c
?
3 ответа
Вы можете передать флаг компилятору (/P, я думаю), который заставляет его выводить весь предварительно обработанный вывод, который передается компилятору - вы можете затем открыть этот (огромный) файл, найти его и необходимую вам информацию. будет где-то там.
Должны ли вы на самом деле конвертировать весь существующий код C в C++? Вероятно, это будет много работы, особенно учитывая то, что вы описали до сих пор.
Вместо этого вы можете написать новый код на C++ и вызвать код на C, используя extern "C"
, Например, в исходном файле C++ вы можете:
extern "C" {
#include "old_c_header.h"
}
Это изменяет связь, поэтому компилятор C++ генерирует внешние ссылки на код C без искажения имени, позволяя компоновщику сопоставлять все.
Обычно вы должны иметь ожидаемую и фактическую подпись в выходных данных.
В противном случае вы можете указать компилятору выводить результаты предварительной обработки в отдельный файл, cl.exe /p
для MSVC и для GCC gcc -E
,