能否禁用GCC关于用户自定义字面量中缺少下划线的警告?

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

int main()
{
    "hello"test;
    return 0;
}
在GCC 4.7中,这会生成"warning: literal operator suffixes not preceded by '_' are reserved for future standardization [enabled by default]"的警告信息。
我理解为什么会出现这个警告信息,但是GCC说"enabled by default"。
是否有可能在不使用-w标记禁用所有警告的情况下禁用此警告信息?

4
哇,我不知道C++11支持重载[运算符“”] (http://ideone.com/ZDyCML)。顺便说一句,在ideone中存在的g ++至少不会发出警告,但我的本地编译器会。只是为了其他人的信息(不知道上下文的人),通过将test更改为_test,警告就消失了。 - iammilind
12
为什么你想这样做?后续的 C++ 版本可能会包含潜在的冲突符号,这是不好的。GCC 的问题在于它没有像应该的那样给出错误提示。 - Nicol Bolas
1
@Nicol,感谢您的评论。对于我来说,这个警告确实会导致错误,因为我使用了-Werror。虽然GCC有许多有价值的警告,但我们仍然允许程序员明确地禁用它们。 - cmeub
5
但这正是我的观点:它不应该是一个警告。它应该是一个错误。根据C++11标准,如果用户定义的字面值没有以“_”开头,则是不符合规范的。GCC 不应该让你关闭它,就像它不应该让你关闭右值引用、可变参数模板或任何其他单独的 C++11 功能一样。庆幸的是它让你关闭异常和 RTTI。 - Nicol Bolas
2
出于好奇,您能否解释一下为什么您绝对需要在用户定义字面值时不使用下划线? - Piotr99
1
实际答案在这里,并且可以与pragma结合使用。在上面的问题上这样做是一个坏主意,但我因为标题(实际上我正在尝试将C++14功能 - ""s - 添加到我的C++11代码中)而找到了这个问题。 - firda
2个回答

6
阅读了这个问题的几条评论后,我查阅了C++11标准(非最终草案N3337)。
当我说“我理解为什么会产生这个警告”时,我是错误的。我认为下划线在技术上并不是必需的,只是一种建议(因此会产生警告而不是错误)。
但正如Nicol Bolas所提到的,标准在谈论用户定义的字面量时使用了以下语言:
“不以下划线开头的文字后缀标识符保留用于未来的标准化。”usrlit.suffix “某些文字后缀标识符保留用于未来的标准化;请参见[usrlit.suffix]。使用此类文字后缀标识符的文字操作符ID的声明是不良形式的,无需诊断。”over.literal 这与保留标识符和“替代表示”(例如“and”,“or”,“not”)使用的语言类似。我认为这很清楚地表明,这实际上不应该是一个警告,而应该是一个错误。
这可能不是直接回答“是否可以禁用”的问题,但对我来说已经足够了。

1

就此而言,-Wno-literal-suffix自gcc-7版本起可以消除这个警告(在godbold上看到),也就是说,这个选项还可以关闭没有前导下划线的用户定义字面量运算符的警告:

-Wliteral-suffix(仅适用于C++和Objective-C++)

...

此外,当声明带有不以下划线开头的字面量后缀标识符的用户定义字面量运算符时,会发出警告。不以下划线开头的字面量后缀标识符保留给未来的标准化。


然而,应该遵循@cmeub's answer中的建议,尽量避免使用没有下划线的字面后缀标识符,因为这会导致程序格式不正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接