2013-10-30 12 views
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はのホールドを取得するときには、

error: pasting "(" and "XF" does not give a valid pre-processing token

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

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

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

なぜGCCはそれに挑むだろうが、TIコンパイラはそれを許しているのだろうか?私はその答えを推測していますが、 "仕様のあいまいな部分"のようなものです。

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

更新

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

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

ありがとうございます。

+3

関数呼び出しの中で '#'(文字列化)演算子を使うことを意図した可能性はありますか? –

+0

わかりません。なぜTIコンパイラで動作するのか説明できません。 – user2939408

答えて

4

曖昧でない仕様はありません。 ##は、トークンのレベルで動作します。貼り付けられた2つのトークンは、有効なトークンをもう一度形成する必要があります。 (は、アルファベット文字を含むトークンを形成しないため、エラーメッセージが表示されます。

+0

ありがとうございます。だから、古いコンパイラはなぜそれを受け入れるだろうか? 混乱しているのは、なぜ最初に行われたのですか? ##はそれらを一緒に接着するだけではありませんか? – user2939408

+3

それを受け入れた古いコンパイラは、ばかげた - 別名バグだった。 –

関連する問題