2016-03-26 3 views
1

gtestからの奇妙なエラーメッセージが発生しました。なぜgtestは私の式が気に入らないのですか?

EXPECT_EQ(MyVal,0xe -2); 

EXPECT_EQ(MyVal,0xf-2); 

は罰金コンパイルしながら、

unable to find numeric literal operator 'operator"" -2' 

:エラーメッセージの

EXPECT_EQ(MyVal,0xe-2); 

結果をコンパイルします。何か案は? (たぶんそれは累乗を試みますか?)

答えて

2

これは古典的なC/C++の問題です。

0xe-2pp-number前処理数)トークンため:

  • -を除いて、数字と文字で構成さ

    • それは数字で始まり、

    • eの後に続きます。

    したがって、単一のトークンです。ただし、トークンは数値リテラルに対応していないため、前処理後に有効なトークンではありません。これとは対照的に

    0xf-2は、3つのトークンである:0xf-、および2、およびすべての3つは、前処理後に有効です。

    オペレータの周囲に空白を入れるのが常に良いです。空白文字は非常に手頃な価格です。

  • +0

    これまでは、C++!空白を無視します。そうでない場合はどこでケースを見つけることができますか? – katang

    +0

    ありがとう、私は完全にそれを理解していません。それが1つのトークンである場合、処理で演算子が検索されるのはなぜですか?前処理が 'e-2'のような例外を考慮し、結果が間違っている場合、 「f-2」と同様に解釈しようとしないのはなぜですか?示されている方法では、合法的な式は、後続のプリプロセッサのためにfalseと評価されます。 – katang

    +0

    'literal operator" "エラーは、数値リテラルに付加された文字列(長さと記号のサフィックスのような)であるユーザ定義のリテラル変換演算子を許可するC++ 11の機能を指します。 Afaik、文字通りの演算子は文字か '$'で始める必要があるので、エラーメッセージはちょっと奇妙です。なぜそれが別のレックスを試していないのかというと、唯一の答えは "それが標準のことだから"です。しかし、C++はあなたが意味するかもしれないものを決して見つけようとしないので、一貫しています。 – rici

    関連する問題