C++ 如何将原始字符串文本传递给[[已弃用(消息)]]属性?

C++ 如何将原始字符串文本传递给[[已弃用(消息)]]属性?,c++,attributes,c++14,deprecated,rawstring,C++,Attributes,C++14,Deprecated,Rawstring,我想将原始字符串文本作为消息传递给[[deprecated(message)]]属性。消息被反复使用。所以我想避免代码重复 首先,我尝试使用静态constexpr变量 static constexpr auto str = R"( Use this_func() Description: ... Parameter: ... )"; [[deprecated(str)]] void test1() { } 我得到错误“不推荐的消息不是字符串”。[[deprecated(message)]似

我想将原始字符串文本作为消息传递给
[[deprecated(message)]]
属性。消息被反复使用。所以我想避免代码重复

首先,我尝试使用静态constexpr变量

static constexpr auto str = R"(
Use this_func()
Description: ...
Parameter: ...
)";

[[deprecated(str)]] 
void test1() {
}
我得到错误“不推荐的消息不是字符串”。
[[deprecated(message)]
似乎不接受静态constexpr变量

我试图将行字符串文字定义为预处理器宏

#define STR R"(
Use this_func()
Description: ...
Parameter: ...
)"

[[deprecated(STR)]]
void test2() {
}
在clang++8.0.0上,它的工作原理与我预期的一样,如下所示

prog.cc:38:5: warning: 'test2' is deprecated: 
Use this_func()
Description: ...
Parameter: ...
 [-Wdeprecated-declarations]
    test2();
    ^
演示:

但是g++9.2.0输出编译错误如下:

prog.cc:19:13: error: unterminated raw string
   19 | #define STR R"(
      |             ^
prog.cc:23:2: warning: missing terminating " character
   23 | )"
      |  ^
prog.cc:38:11: warning: 'void test2()' is deprecated:   \\nUse this_func()  \\nDescription: ... \\nParameter: ...   \\n [-Wdeprecated-declarations]

如果我在每行末尾添加反斜杠,则不会发生编译错误,但输出消息与我预期的不同,如下所示:

prog.cc:19:13: error: unterminated raw string
   19 | #define STR R"(
      |             ^
prog.cc:23:2: warning: missing terminating " character
   23 | )"
      |  ^
prog.cc:38:11: warning: 'void test2()' is deprecated:   \\nUse this_func()  \\nDescription: ... \\nParameter: ...   \\n [-Wdeprecated-declarations]
我不确定哪个编译器工作正常


有没有办法将原始字符串文字变量/宏传递给
[[deprecated]]
属性?

没有“原始字符串文字变量”这样的东西。可能有一个变量指向字符串文字,但它是一个变量,而不是文字本身。<代码>未被推荐的属性不将C++常量表达式评估为字符串。它需要:一个实际的令牌序列


因此,您最多只能使用宏来包含字符串文字。当然,宏和原始字符串文字不能很好地结合在一起,因为原始字符串应该消耗整个文本。因此,
\
字符将作为宏的延续,并且是字符串的一部分。

真正的问题是如何定义宏以扩展为原始字符串文字这似乎是gcc的显示问题,请参阅@康桓瑋, 非常感谢。即使我们直接在“`[[deprecated()]]”上编写原始字符串文字,gcc也会输出一行并转义
\n
。我明白。让我们接受这个限制。但我仍然有一个问题,那就是如何避免代码重复。(不是原始的)字符串文字和``格式良好?看见它并不优雅,但我可以避免代码重复。@TakatoshiKondo:是的,您可以在宏中放入常规字符串文字。只有原始字符串文本的解析异常才使得它们在宏中无法正常工作。