2009-04-01 26 views
1

私は古いlinuxプラットフォームからkubunutu 9.04にプロジェクトを移動しようとしています。 GCC 4.3.3でコンパイルしたときに今、私はこのエラーを取得する:コンパイルエラー:cpumask.h: "and"がマクロパラメータリストに表示されない可能性があります

/usr/src/linux-headers-2.6.28-11-generic/include/linux/cpumask.h:600:37: error: "and" may not appear in macro parameter list 

私は右のメッセージを理解していれば、それは「予約済みの命令」であることから、マクロのパラメータとして使用「と」することはできません。それに関する2つの質問:

  1. これはどのように可能ですか?私は、Linuxのヘッダファイルにこのような間違いがあるとは想像できません。私は前に何か間違っていましたか?私は#undefを試しましたが、これは役に立たないでしょう。
  2. このエラーを修正するにはどうすればよいですか?私はLinuxのヘッダーファイルを変更する必要がありますが、それは本当ですか?

ありがとうございました。

+0

@このソリューションは、私がやる事はこれで発見:私は.HPPにが含まれますファイル。しかし、私は(他の)奇妙なことをする前にそれをしない...任意のアイデア? – Chris

+0

ありがとう、私はこれの理由を少なくとも理解しています:cpumask.hで定義されたマクロはCマクロであるため、C++プリプロセッサの制限を満たしていません。しかし、私はまだこれを修正する簡単な解決策があるのだろうか、あるいは.htを.cpp/.hppに含めることを望んでいる唯一の人ですか? – Chris

答えて

1

に焦点を当てているだけなので、カーネル開発者はあまり気にしません。 andkeyword in C++ but not Cです(彼らは&&を使用しています)。

インライン関数の代わりにカーネルの人がマクロを使用することがあります。しかし、マクロが必要なのは、呼び出し元の関数のスコープ内でマクロを実行する必要があり、それを実行する関数を定義しても機能しない場合があるからです(たとえば、現在の関数の名前を調べるマクロ)。

マクロが本当に偽のインライン関数であると仮定すると、これらのマクロを呼び出す関数だけで独自の.cファイルを作成し、コンパイルし、extern "C"ヘッダーを使用してこれらの関数を参照することができます。あなたは同じ動作をしますが、パフォーマンスは少し悪くなります(これは問題ではありません)。

マクロが実際にマクロである必要がある場合は、C++に準拠するように手作業で編集することをお勧めします。

1

LinuxのヘッダはCヘッダであり、C++ではありません。

+0

おそらくextern "C"がこれを修正しますか? –

+0

いいえ、それは勝利しました - それは言語の構文ではなく、リンケージを指定するだけです。 –

+0

もちろん、私はどのように愚かです。解決策はファイルを含まないことです。 –

0

問題の行も表示されていれば役立ちます。ヘッダーをインクルードする前に何か狂っていると、コンパイラが混乱して、明らかでないエラーメッセージが生成される可能性があります。

ありケースがある「と」実際には予約語であり、それは、C++だ場合 - カーネルが、私は問題があることであると信じC.

関連する問題