0

私は巨大な古いCプログラムの世話をしていて、それを C++ に変換しています (これは初めてです)。

プログラムが多くの異なるプラットフォーム上で多くの異なる構成で実行されなければならないという事実に関連して、非常に多くの複雑なプリプロセッサ ハックが行われています。

1 つのファイルで (それを と呼びますfile1.c)、私はを呼び出し functionA()ています。
そして、別のファイル ( と呼びますfile2.c) には、 の定義がありfunctionA()ます。

残念ながら、関数の正確な型は、途方もない数の方法で作成されたマクロのコレクションによって指定されます。

現在、リンカーは次のように不平を言っています。

functionA は未解決の外部シンボルです。

問題は、file1.c に見られるプロトタイプが、file2.c に見られる関数の実際の定義とわずかに異なることだと思います。

_cdeclと の間、およびfastcallあり と なし の間の不一致による微妙な違いの余地がたくさんあります__forceinline

コンパイラが とは対照的にで見られるの型であると考えているものを正確に示す方法はありますか?functionA()file1.cfile2.c

4

3 に答える 3

1

既存のすべての C コードを実際に C++ に変換する必要がありますか? 特にこれまでに説明したことを考えると、これは多くの作業になる可能性があります。

代わりに、C++ で新しいコードを記述し、 を使用して C コードを呼び出すことができますextern "C"。たとえば、C++ ソース ファイルでは次のことができます。

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

これによりリンケージが変更されるため、C++ コンパイラは名前マングリングなしで C コードへの外部参照を生成し、リンカはすべてを一致させることができます。

于 2009-10-01T08:36:38.270 に答える
1

フラグをコンパイラ (/P だと思います) に渡すと、コンパイラに渡される前処理済みの完全な出力が出力されます。その後、この (巨大な) ファイルを開いて、必要な情報を検索できます。そこのどこかにあるでしょう。

于 2009-10-01T08:33:24.600 に答える
0

通常、出力には期待される署名と実際の署名が含まれているはずです。

cl.exe /pそれ以外の場合は、前処理の結果を MSVC と gcc の別のファイルに出力するようにコンパイラに指示できますgcc -E

于 2009-10-01T08:37:50.890 に答える