如何将原始字符串文字传递给 [[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:一个实际的标记序列。
因此,您最多只能使用宏来包含您的字符串文字。当然,宏和原始字符串文字不能很好地结合在一起,因为原始字符串应该会占用整个文本。因此 \
字符将充当宏 和 的两个延续,成为字符串的一部分。
我想将原始字符串文字作为消息传递给 [[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)]]
.
我尝试将行字符串文字定义为预处理器宏。
#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:一个实际的标记序列。
因此,您最多只能使用宏来包含您的字符串文字。当然,宏和原始字符串文字不能很好地结合在一起,因为原始字符串应该会占用整个文本。因此 \
字符将充当宏 和 的两个延续,成为字符串的一部分。