• 締切済み

関数式マクロでエラーです。

原因と解決方法を教えてください。 御願いします。 ・現象  Solarisでは問題なくコンパイル出来ますが、Linux(以下のバージョン参照)上ではエラーになります。  他の人によるとgcc 2.xでは問題なけれど、gcc 3.x以上ではエラーになると聞きましたが… ・質問  1.コンパイラのバージョン問題ですか?  2.解決するにはパッチが必要ですか?  3.必要だったら、何のパッチが必要ですか?  (ソースの修正なしで解決したいです。) ・エラーメッセージ: define_test.c:38:1: pasting "_test" and "(" does not give a valid preprocessing token Kernel:Red Hat Enterprise Linux AS release 4 (Nahant) Compiler:g++ (GCC) 3.4.3 20041212 (Red Hat 3.4.3-9.EL4) -- 以下 ソース -- #include <stdio.h> #include <stdlib.h> #define SEND4(o, m, l, on_off) o->send_extr_indir(o->_##m##l, on_off) class Define { public: int send_extr_indir(int data1, int data2); int _test(int arg1, int arg2); int test(void); }; int Define::send_extr_indir(int data1, int data2) { printf("data1=%d\n", data1); printf("data2=%d\n", data2); return data1+data2; } int Define::_test(int arg1, int arg2) { return arg1 + arg2; } int Define::test(void) { return SEND4(this, test, (1,2), 5 ); } int main(void) { int result = 0; Define object; result = object.test(); printf("result=%d\n", result); return 0; }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ああ, Define::_test も external linkage を持つので可搬性がないような気がします.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

えと.... 最終的に ## で連結してできるトークンは _test( となりますが, これは「正しいプリプロセッシングトークン」ではないため, 結果は undefined です. つまり, 処理系はどのように解釈してもよい (解釈しなくてもよい) ので, _test( という「関数呼び出し (のようなもの)」と解釈しようと「エラー」にしようと規格上問題ありません. つまり, 「コンパイラのバージョン」がどうとかいう問題ではなく, 「ソースが間違っている」ということになります.

関連するQ&A