2009-10-01 5 views
0

나는 거대한 오래된 C 프로그램을 찾고 있으며 C++로 변환했다.함수 선언과 해결되지 않은 외부

많은 복잡한 전처리 프로그램이 여러 가지 구성에서 다양한 플랫폼에서 실행되어야한다는 사실에 연결된 많은 사전 처리기 해킹이 있습니다.

하나의 파일 (file1.c)에서 나는 입니다. 전화는functionA()입니다.
다른 파일 (file2.c)에 의 정의functionA()입니다.

불행히도 기능의 정확한 유형은 어리둥절한 방법으로 만들어진 매크로 모음에 의해 지정됩니다.

functionA가되지 않은 외부 기호이다

지금 링커 불평한다.

file1.c에 표시된 프로토 타입이 file2.c에 표시된 함수의 실제 정의와 약간 다른 것으로 의심됩니다.

_cdeclfastcall 사이, 그리고 __forceinline이 있거나없는 사이의 미스 매치로 인해 미묘한 차이가 발생할 수있는 범위가 많이 있습니다.

표시하는 몇 가지 방법이 있나요 정확히 컴파일러가 file2.c에 반대 file1.c으로 볼 때 functionA()의 유형이 어떻게 생각하는지?

답변

1

컴파일러에 전달되는 전처리 된 전체 출력을 출력하도록하는 플래그를 컴파일러에 전달할 수 있습니다. (거대한) 파일을 열어 검색 할 수 있습니다. 필요한 정보가 어딘가에있을 것입니다.

+0

+1. 고마워요 ... 그것이 새로운 질문에 넣은 더 깊은 신비를 드러 냈지만 다소 도움이되었습니다. – Mick

1

실제로 모든 기존 C 코드를 C++로 변환해야합니까? 이것은 많은 작업이 될 것 같습니다. 특히 지금까지 설명한 내용을 고려할 때.

대신 C++로 새 코드를 작성하고 extern "C"을 사용하여 C 코드를 호출 할 수 있습니다. 예를 들어, 당신이 할 수는 C++ 소스 파일 : C++ 컴파일러는 링커가 모든 것을 일치 할 수 있도록, 이름 맹 글링없이 C 코드에 외부 참조를 생성하므로

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

이는 연결을 변경합니다.

+0

불행히도 나는 여러 가지 이유로 C++로 변환해야하지만 어쨌든 팁을 주셔서 감사합니다. – Mick

0

일반적으로 예상되는 서명과 실제 서명이 출력에 있어야합니다.

그렇지 않으면 MSVC의 경우 cl.exe /pgcc -E의 경우에 전처리 결과를 별도의 파일로 출력하도록 컴파일러에 지시 할 수 있습니다.

+0

링커는 찾지 못하는 함수의 정확한 선언을보고합니다. 아마도 file1.c에 해당하는 함수이지만 file2.c에 해당하는 함수에 대해서는 단서가 없습니다. – Mick

+0

너무 좋지 않아, 전 처리기 출력과 grep/함수 이름 검색이 도움이 되길 바랍니다. –

관련 문제