2016-07-16 43 views
1

まず、 "g ++ -std = C++ 0x -Wall"が私に与える理由は分かりません警告:リテラルには無効な接尾辞があります。 C++ 11には、以下のプログラムにリテラル文字列マクロ[-Wliteral-サフィックス]の間にスペースが必要です。g ++で特定の警告を無効にする方法

#include <iostream> 

#define BEGIN "<b>" 
#define END "</b>" 

#pragma GCC diagnostic ignored "-Wliteral-suffix" 
int main() 
{ 
    std::cout << "hello " BEGIN"world"END "\n"; 
} 

第二に、私は「-Wliteral-サフィックスを」無視するgcc docを追ったが、それでも警告を受けました。どのように警告を抑止するのですか?そして、コンパイラはなぜ最初に警告を発するのですか?

+1

警告の内容はわかりませんが、とにかく抑制したいのですか?それが何であるかわからない場合は、それを抑止することが適切な対応であるとどのように判断できますか? – hvd

+0

この警告はgccバグのように見えます。そのため、私はそれを抑制したいのです。 – zhao

+2

どうやら抑止できないのは既知のgccバグです(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61653)。なぜそれが気になるのか分かりません。コードは私にはうまく見えます(#defineは目が痛い)。リテラルと#defineの文字列の間にスペースを置くだけで解決できます。テキストは変更されません。 –

答えて

1

[OK]をまとめると、警告が表示されないことは既知のgccバグです(gcc.gnu.org/bugzilla/show_bug.cgi?id=61653)。警告を抑制することはできないので、リテラルと#define文字列の間にスペースを入れるのが最も簡単な方法です。あなたはこれを安全に行うことができます。出力テキストは変更されません。

リテラル文字列の直後の文字は、C++ 11の新機能であるユーザー定義のリテラルとして扱われるため、これがもう許可されない理由があります。ユーザ定義のリテラルは、それらが変更するリテラルと同じ単一のトークンの一部であるとみなされるため、ENDは以前の#defineに置き換えられません。

+0

以前は「ユーザー定義のリテラル」について聞いたことがなく、またこの機能を使用するのは不思議です。どうやらgccは文字列を使用していることを知っています(警告メッセージが読み込まれる)ので、あまりにもあいまいさがなくマクロを展開できるのはなぜですか? – zhao

+0

他の場合にはあいまいさがあるかもしれないので、私は思います。有用な機能については、私は確かに可能性のある使用を考えることができますが、もし誰もができるだけ多くのものを使用するなら、可能な名前空間汚染についていくつかの留保があります。私たちはそれがどのように発展するかを見なければならないでしょう。 –

関連する問題