ozg*_*gur 1 c string return string-literals storage-duration
在zflog库中,我看到了这段代码
static char* lvl_char(const int lvl)
{
switch (lvl)
{
case ZF_LOG_VERBOSE:
return "VERBOSE\0";
case ZF_LOG_DEBUG:
return "DEBUG\0";
case ZF_LOG_INFO:
return "INFO\0";
case ZF_LOG_WARN:
return "WARN\0";
case ZF_LOG_ERROR:
return "ERROR\0";
case ZF_LOG_FATAL:
return "FATAL\0";
default:
ASSERT_UNREACHABLE("Bad log level");
return "?\0";
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很奇怪.我们真的可以从静态函数返回一个本地c字符串吗?
函数的链接(这里是静态的)根本不重要.也没有返回"字符串"; 而是返回的是指向char的指针.将指针返回到字符串文字的第一个字符是完全合法的 - 字符串文字保证在程序的整个持续时间内存在.C11 6.4.5p6声明这里使用的字符串文字用于初始化*" 静态存储持续时间和长度的[匿名]数组,只足以包含序列".静态存储持续时间意味着它的"生命周期是程序的整个执行,其存储的值仅在程序启动之前初始化一次".(C11 6.2.4p3).
该物件确实看起来很奇怪的是\0在字符串文字的端部,作为文字串总是0封端,因此基本上"VERBOSE\0"将被刚刚终止2零个字节,而不是通常的一个; strlen对于该字符串将返回7正如它将返回"VERBOSE",等等.