Объявления функций и неразрешенный внешний

Я смотрю на огромную старую программу на 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,

Другие вопросы по тегам