例如,在编译.c文件时,我希望cmake只是打印
CC xxx.c
Run Code Online (Sandbox Code Playgroud)
到stdout,就像linux kbuild一样.
这个想法来自/sf/answers/1104286361/
我在 string_view 末尾添加了一个 '\0',这样我们就可以将 data() 用于 printf、spdlog 等。
我使用这个宏来打印带有类名的函数名。
但是,我发现编译器不够智能,无法内联字符串,而是需要先进行内存复制才能堆栈:
https://godbolt.org/z/bqob37G3z
请参阅 main 函数中 CALL 和 CALLFUNC 的区别。
是否可以告诉编译器将字符串放在某个 RO 部分中,例如 const char *?
template<std::size_t N>
consteval const std::array<char, N> __get_function_name(const char * arr)
{
std::array<char, N> data {};
std::string_view prettyFunction(arr);
size_t bracket = prettyFunction.rfind("(");
size_t space = prettyFunction.rfind(" ", bracket) + 1;
size_t i;
for (i = 0; i < bracket - space; i += 1) {
data[i] = arr[space + i];
}
data[i] = '\0';
return …
Run Code Online (Sandbox Code Playgroud)