Объявления функций и неразрешенный внешний - PullRequest
0 голосов
/ 01 октября 2009

Я ищу огромную старую C программу и конвертирую ее в C ++ (что я новичок).

Существует множество сложных взломов препроцессоров, связанных с тем, что программа должна работать на разных платформах в разных конфигурациях.

В одном файле (назовите его file1.c) я звоню functionA().
И в другом файле (назовите его file2.c) у меня есть определение из functionA().

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

Теперь компоновщик жалуется, что:

функция A - это неразрешенный внешний символ.

Я подозреваю, что проблема в том, что прототип, как видно из file1.c, немного отличается от истинного определения функции, как это видно из file2.c.

Существует множество возможностей для тонких различий из-за несоответствия между _cdecl и fastcall, а также между и без __forceinline.

Есть ли какой-нибудь способ показать точно , что компилятор считает типом functionA(), как замечено file1.c в отличие от file2.c?

Ответы [ 3 ]

1 голос
/ 01 октября 2009

Должны ли вы на самом деле конвертировать весь существующий код C в C ++? Вероятно, это будет много работы, особенно учитывая то, что вы описали до сих пор.

Вместо этого вы можете написать новый код на C ++ и вызвать код на C, используя extern "C". Например, в исходном файле C ++ вы можете:

extern "C" {
#include "old_c_header.h"
}

Это изменяет связь, поэтому компилятор C ++ генерирует внешние ссылки на код C без искажения имени, позволяя компоновщику сопоставлять все.

1 голос
/ 01 октября 2009

Вы можете передать флаг компилятору (я думаю, что / P), который заставляет его выводить весь предварительно обработанный вывод, который передается компилятору - вы можете затем открыть этот (огромный) файл и выполнить поиск по нему и необходимая информация будет где-то там.

0 голосов
/ 01 октября 2009

Обычно вы должны иметь ожидаемую и фактическую подпись на выходе.

В противном случае вы можете указать компилятору выводить результаты предварительной обработки в отдельный файл cl.exe /p для MSVC и для gcc gcc -E.

...