7

TI コンパイラで正常にコンパイルされる TI コードからいくつかのマクロを処理しようとすると、GCC でコンパイラ エラーが発生します。

問題のマクロは、

#define CHIP_FSET(Reg,Field,Val)     _CHIP_##Reg##_FSET(##Field,Val)

そしてそれは次のようなコードで使用されます

CHIP_FSET(ST1_55, XF, CHIP_ST1_55_XF_OFF)

そしてGCCがそれを手に入れると、それは言う

エラー: "(" と "XF" を貼り付けても、有効な前処理トークンが得られません

Field の前の ## を削除すると、正常に前処理されます。コードを正しく理解している場合、フィールドの前の ## は無関係に見えます。これは、2 つのパラメーターを受け取る関数呼び出し (または別のマクロ呼び出し) に変換されるためです。したがって、## は冗長であり、元の置換は ..._FSET(Field,Val) になります。

それで、私は何が欠けていますか?## プリプロセッサ ディレクティブで見つけたものはすべて、テキストをくっつけただけだと言っています。したがって、この場合、## はそもそも何もしませんでした。

私は何が欠けていますか?

そして、なぜGCCはそれをチョークするのに、TIコンパイラはそれを許可するのでしょうか? それに対する答えは、「仕様のあいまいな部分」のようなものだと思います。

=========================

アップデート

問題は、完全に解決されていない可能性のあるネストされたマクロが多数あるためだと思います。コンパイラが最終的に得たものは無効であるため、それらすべてを処理するある時点でダミーを吐き出します。

不足しているマクロを埋めて問題を悪化させることができましたが、他の部分が壊れてしまいました。これが、プラットフォームとコンパイラの間でコードを移植する喜びだと思います。

助けてくれてありがとう。

4

1 に答える 1