如何将原始字符串文字传递给 [[deprecated(message)]] 属性?

How to pass raw string literals to [[deprecated(message)]] attribute?

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

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

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

[[deprecated(str)]] 
void test1() {
}

我收到错误 "deprecated message is not a string"。 [[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();
    ^

演示:https://wandbox.org/permlink/gN4iOrul8Y0F76TZ

但是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 | )"
      |  ^

https://wandbox.org/permlink/e62pQ2Dq9vTuG6Or

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

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

prog.cc:38:11: warning: 'void test2()' is deprecated:   \nUse this_func()  \nDescription: ... \nParameter: ...   \n [-Wdeprecated-declarations]

我不确定哪个编译器工作正常。

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

没有 "raw string literal variable" 这样的东西。可能有一个指向字符串文字的变量,但它是一个 变量 ,而不是文字本身。 deprecated 属性不接受计算为字符串的 C++ 常量表达式。它需要一个 string literal:一个实际的标记序列。

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