是否可以在用户定义的文字中禁用GCC警告缺少下划线?

时间:2013-03-12 06:49:51

标签: c++ c++11 user-defined-literals

void operator"" test( const char* str, size_t sz  )
{
    std::cout<<str<<" world";
}

int main()
{
    "hello"test;
    return 0;
}

在GCC 4.7中,这会生成“警告:未在'_'之前的文字运算符后缀保留用于将来的标准化[默认启用]”

我理解为什么会生成此警告,但GCC会说“默认启用”。

是否可以在不通过-w标志禁用所有警告的情况下禁用此警告?

2 个答案:

答案 0 :(得分:4)

在阅读了这个问题的几条评论之后,我回顾了C ++ 11标准(非最终草案N3337)。

当我说“我理解为什么会产生这个警告”时,我错了。 我认为标准在技术上并不需要下划线,而只是建议(因此警告而不是错误)。

但是,正如Nicol Bolas提出的那样,该标准在谈到用户定义的文字时使用以下语言:

  

“不以下划线开头的文字后缀标识符将保留用于将来的标准化。”

     

“包含此类ud后缀的程序格式错误,无需诊断。”

这类似于用于保留标识符的语言和“替代表示”,例如“和”,“或”,“不是”。我认为这很清楚,这首先不应该是一个警告,而是一个错误。

这可能不是“可以禁用”问题的直接答案,但它对我来说已经足够了。

Nicol如果你想提交你的评论作为答案我会改变你的答案(我认为这是可能的)。

答案 1 :(得分:0)

对于有价值的事情,-Wno-literal-suffix会因为gcc-7(请参见godbold的现场直播)而忽略此警告,即此选项也turns off warnings for user defined literal operators without leading underscore

  

-Wliteral后缀(仅C ++和Objective-C ++)

     

...

     

此外,当声明用户定义的文字运算符的文字后缀标识符不是   从下划线开始。文字后缀标识符不开头   带有下划线的标记保留用于将来的标准化。


但是,应该遵循@cmeub's answer中的建议,而应避免使用不带下划线的文字后缀标识符,因为它会导致格式错误的程序。