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

Is it possible to disable GCC warning about missing underscore in user defined literal?

本文关键字:文字 定义 下划线 警告 用户 GCC 于用户 是否      更新时间:2023-10-16
void operator"" test( const char* str, size_t sz  )
{
    std::cout<<str<<" world";
}
int main()
{
    "hello"test;
    return 0;
}

在GCC 4.7中,这会生成"警告:不以'_'开头的字面值操作符后缀被保留用于将来的标准化[默认启用]"

我理解为什么会产生这个警告,但是GCC说"默认启用"。

有可能禁用此警告而不只是通过-w标志禁用所有警告吗?

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

当我说"我明白为什么会产生这个警告"我错了。我假设标准在技术上不需要下划线,而只是一个建议(因此是警告而不是错误)。

但是正如Nicol Bolas所提出的,当谈到用户定义的字面量时,标准使用以下语言:

"不以下划线开头的文字后缀标识符将保留以供将来标准化使用。"usrlit.suffix

"一些文字后缀标识符保留用于将来的标准化;看到[usrlit.suffix]。如果一个声明的literal-operator-id使用了这样的字面后缀标识符,那么该声明就是格式错误的,不需要进行诊断。over.literal

这类似于用于保留标识符和"替代表示"的语言。例如"and", "or";我认为这很清楚地表明,这实际上不应该是一个警告,而是一个错误。

这可能不是"是否有可能禁用"这个问题的直接答案,但对我来说已经足够了。

值得注意的是,自gcc-7以来,-Wno-literal-suffix沉默了此警告(参见此处的godold),即该选项还关闭了用户定义的不带前导下划线的文字操作符的警告:

-Wliteral-suffix (仅c++和objective - C + +)

另外,当用户定义的字面值操作符声明了一个不存在的字面值后缀标识符时,发出警告以下划线开头。不开始的字面后缀标识符为将来的标准化保留。


但是,应该坚持@cmeub的回答中的建议,避免使用没有下划线的字面后缀标识符,因为它会导致不良的程序。