3

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

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

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

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

我收到错误“不推荐使用的消息不是字符串”。似乎静态 constexpr 变量不被[[deprecated(message)]].

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

#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]

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

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

4

1 回答 1

1

没有“原始字符串文字变量”之类的东西。可能有一个变量指向一个字符串文字,但它是一个变量,而不是文字本身。该deprecated属性不采用对字符串求值的 C++ 常量表达式。它需要一个字符串文字:一个实际的标记序列。

所以你能做的最多就是使用一个宏来包含你的字符串文字。当然,宏和原始字符串文字不能很好地结合在一起,因为原始字符串应该消耗整个文本。所以这些\字符将作为宏的延续字符串的一部分。

于 2019-08-27T13:38:05.720 回答