0

単純なインクルード ファイルに問題があります。

インクルードされているファイルは 2 つの MFC プログラムに含まれています。そのうちの 1 つは dll であり、それ自体を非 mfc dll にコンパイルします。

最近、大きなdll によって公開されていない元のコードの機能のいくつかにアクセスしたいときに、小さな dllのソースをラップする大きな dll を使用していました。

これはテストだったので、ソースをプロジェクトに追加して関数を呼び出すだけでした。このエラーが発生しました:構文エラー:「;」の前に「)」がありません

ファイルは正しく含まれており、ソース フォルダーとプロジェクト内に .cpp と .h の両方がありますが、コンパイルされません。

最終的に、main.cpp、spooler.cpp、および spooler.h (スプーラは通信のラッパーです) という非常に小さなテスト プロジェクトを作成し、それをコンパイルしようとしました。同じ問題。

そのため、奇妙な問題が発生し、それでもコンパイルできない場合に備えて、すべての dll 関連のものを削除しました。

何が悪いのか、自分の人生を考えることはできません。他に何かアイデアはありますか?

ps ジェフ、ファイルを添付する機能を本当に追加する必要があります。なぜなら、ソースがあまりにも多くの画面をデータでいっぱいにするからです。

4

7 に答える 7

9

/P オプションを使用してビルドします。これにより、前処理されたファイル (通常は .i 拡張子) が作成されます。

Visual Studio では、オプションは次のようなプロジェクトのプロパティになります。

C/C++  -  Preprocessor  -   Generate Preprocessed File

これにより、マクロがどのように展開されているかを正確に確認できます。コンパイラで .i ファイルを実行して、構文エラーの原因となっている正確な行を見つける必要がある場合があります。後処理されたファイルを読むのは面倒かもしれませんが、何が起こっているかを示すはずです。

于 2008-10-31T15:33:43.600 に答える
2

ソースがなければ、何が起こっているのかを正確に確認することは困難です. 質問の最初の部分から、この特定のコードは最初に使用されたプロジェクトで正しくコンパイルされるように見えますが、2 番目のプロジェクトに含めるとコンパイルされなくなります。この場合、このヘッダーの前に含まれる他のヘッダーを調べます。関数または変数の名前が別のヘッダー (特に windows.h) で定義されているものと同じ場合、以前に問題なくコンパイルされたコードからエラーが発生することがあります。

このコードが正しくコンパイルされていない場合は、開始/終了の「(」を確認することを提案する他の回答がおそらく開始する場所です。

于 2008-10-31T14:49:10.697 に答える
2

これは、ファイルをインクルードする方法とは何の関係もありません。これは、正しくネスト()ていないために発生する構文エラーです。

于 2008-10-31T14:38:58.407 に答える
1

物事が何に展開するかを知る必要があります。特に、ID_SPOOLER_EVENT とは何ですか? かっこのバランスが取れていない場合は、それが原因です。そうでない場合は、Mike B のアドバイスに従ってください。これは私にはプリプロセッサの問題のように見えます。

于 2008-10-31T15:59:49.663 に答える
1

コンパイラは、エラーが発生した行を通知する必要があります。その行末の前にある「(」を検索してみてください。

于 2008-10-31T14:41:04.503 に答える
0

Mike Bがプリプロセッサで言ったことを試してください。

その提案は、なぜそのエラーがとても見慣れたものに見えるのかを思い出させてくれました。私にとっては#define、変数名をリテラル int などに置き換えるのは非常に短いものでした。汚い。

プリプロセッサを介してコードを実行することで、何が起こっているのかを知ることができました。

于 2008-10-31T16:09:52.997 に答える
0

使用されているコード:

// the only two includes
#include <windows.h>
#include "spooler.h"
// in WinMain
// create window then...
ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);

SpoolerInitiallize( hwnd, ID_SPOOLER_EVENT ); // <-- our function
...

はい、スペルが間違っていることは知っていますし、ドキュメント全体でも初期化という単語のスペルが間違っています。残念ながら、この dll はサードパーティにも提供されているため、変更することはできません。

于 2008-10-31T15:01:15.197 に答える