C

状況の誤った分析のC ++問題は、 '('トークンの前に予期されたunqualified-idを解明します



C Problem Wrong Analysis Situation Unravel Expected Unqualified Id Before Token



今日、Soundsのコードでは、突然、このような比較的奇妙なエラーが発生しました[長い間予想されていたunqualified-id before '(' token]で、最後の数字がより明確になる可能性があります。




行317ファイルX_pb.h内の指定された位置(X_pb.h protobufこのファイルは自動的に生成されます)。その最初の反応は、このファイルが自動的に生成されるということですが、どのように問題が発生する可能性がありますか?心配しないでください、私たちは少し見ています。ファイルを見つけるための317行。




ほとんどの目が広い円を描き、30秒間凝視し、それでも何が起こるかを見ることができなかった程度まで。

解決策 :グーグルとバイドゥを助けて

キーワードは '('トークンノックインの前にunqualified-idを期待し、長い間探していましたが、私が遭遇したそのような問題はありません。



解決策2 :除外。

削除された関連コードへのこのprotobufの使用は、このドキュメントを参照しないようにします。それを試してみました、それはイーの成功のために削除することができます。これはファイルが原因であることを示しています。

さらに:なぜこの行が間違っているのですか?同じ場所ではないのは何ですか?

私はそれを試しました、名前を変更しようとしました、名前を変更するためのerrno()関数、奇妙な、実際にコンパイルされました。本当にこの行の問題。

その他の質問 :なぜ問題があるのか​​errno()?名前の衝突は誰ですか?

途中で、戻ってコードを変更します。事前にプログラムされた解凍ツールを使用してコードを解凍し、前処理を行います。g++ -Eの方法を使用して.cpp処理を失敗させると、内部は次のようになります。

一般的に問題が発生する場所を見つけます。errno()関数の定義が場所、受動的な手と足であることがわかります。以下に示すように:


実際に置き換えられた__errno_location()は、それほど遠くないところにあり、ゴーストからのマクロ定義であることがわかりました。

#define errno(* __ errno_location())

これまでのところ、問題の直接的な原因が見つかっています。コードが#includeで導入されたため、このマクロ定義の存在、マクロ定義が前段階で解明され、関数名を削除するために直接私に送られました。

解決:

1、この関数名を使用することはできません、直接変更。

2、このドキュメントの冒頭で、#undef errnoを使用してマクロの干渉をシールドし、事前にプログラムされた解きほぐし段階を通じて通常の機能が実行されるようにします。