Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;编译时的字符串连接_C++ - Fatal编程技术网

C++ C++;编译时的字符串连接

C++ C++;编译时的字符串连接,c++,C++,我想写日志,我需要有关源文件和行的数据。 这行代码是否在编译时工作: constexpr std::string_view source = (std::string(__FILE__) + ":" + std::to_string(__LINE__)); 如果它在编译时不工作,我将如何做?也许这是不可能的?这将在不分配资源和编译时间的情况下工作 #include <iostream> #define STR_(X) #X #define STR(X) STR

我想写日志,我需要有关源文件和行的数据。 这行代码是否在编译时工作:

constexpr std::string_view source = (std::string(__FILE__) + ":" + std::to_string(__LINE__));

如果它在编译时不工作,我将如何做?也许这是不可能的?

这将在不分配资源和编译时间的情况下工作

#include <iostream>

#define STR_(X) #X
#define STR(X) STR_(X)

int main() 
{
    //constexpr std::string_view(const char*) doesn't work in some versions of gcc, but is a better alternative if the compiler supports it
    constexpr const char* str = __FILE__ ":" STR(__LINE__);
    std::cout << str << std::endl;
}
#包括
#定义STR_ux(X)#X
#定义STR(X)STR_ux
int main()
{
//constexpr std::string_视图(const char*)在某些版本的gcc中不起作用,但是如果编译器支持它,它是一个更好的选择
constexpr const char*str=\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu文件“:“str(\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;

std::cout如果我没弄错,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuu

#define STRING(s) #s
constexpr std::string_view source = STRING(__FILE__) + ":" + STRING(__LINE__);
它应该在编译时工作


更新: 如评论中所述,我的方法将不起作用。因为
STRING(\uuuuu-LINE\uuuu)
将转换为
“\uuuu-LINE\uuuu”
。因此我需要这样做:

#define _STRING(s) #s
#define STRING(s) _STRING(s)
constexpr std::string_view source = __FILE__ ":" STRING(__LINE__);
顺便说一句,
\uuuuuuu文件\uuuuuuuu
已经返回了一个char[],所以我不需要转换它,事实上:编译器会自动连接相邻的字符串,所以我也不需要
+

谢谢你指出我代码中的错误。
我把这个bug留在这里,这样其他人也可以从我的错误中吸取教训。

根本无法编译您有一个悬而未决的引用。
source
是一个临时对象的非所有者视图,在完整表达式的末尾被销毁。您应该将
source
变成一个简单的所有者
std::string
insteadmain.cpp:8:59:error:in二进制表达式的有效操作数('const char[9]”和'const char[2]”),即使删除
+
,它仍将仅存储
“\uuuuuuuuu文件:\uuuuu行”
STRING
宏需要另一个间接级别。请参见@Mestkon的答案。严格来说,连接是在预编译时完成的,而不是在编译时:-)