在编译时获取char ptr的字符串len

在编译时获取char ptr的字符串len,c,string,C,String,我想在编译时获取字符串长度 我知道如果我有一个静态字符串,我可以这样做: char string[] = "Hello World"; int len = sizeof( string ) - 1; 这将给我和strlen一样的输出 但是对于char ptr来说,这也是可能的吗 char const * string = "Hello World"; int len = sizeof( string ) - 1; 这给了我len 7,因为我得到了类型的大小。strlen在运行时给了我正确的值

我想在编译时获取字符串长度

我知道如果我有一个静态字符串,我可以这样做:

char string[] = "Hello World";
int len = sizeof( string ) - 1;
这将给我和strlen一样的输出

但是对于char ptr来说,这也是可能的吗

char const * string = "Hello World";
int len = sizeof( string ) - 1;

这给了我len 7,因为我得到了类型的大小。strlen在运行时给了我正确的值,但我想在编译时优化代码。

指针的内容可能会更改,因此编译器无法对字符串的长度做出任何假设,因此无法使用
sizeof
获得长度。如果要使用指针,必须使用
strlen

获取字符串长度。您可以定义一个helper宏:

#define DEF_STRINGVARS(ptrvar, lenvar, literal) \
    const char *ptrvar = "" literal ""; \
    int lenvar = sizeof "" literal "" - 1;
注:

文本前后的
只是使编译器在未扩展为字符串文本时产生错误。(如果你足够努力的话,有很多不正当的方法可以击败这项检查。)

用法:

#include <stdio.h>

#define DEF_STRINGVARS(ptrvar, lenvar, literal) \
    const char *ptrvar = "" literal ""; \
    int lenvar = sizeof "" literal "" - 1;

int main(void)
{
    DEF_STRINGVARS(hello, len, "Hello World")

    printf("%s %d\n", hello, len);
}
请注意,长度不考虑字符串文字中的任何空字符。例如:

DEF_STRINGVARS(hello, len, "Hello\0World")

len
变量初始化为11,而不是5。

关于性能,这是否真的是代码中的瓶颈,需要对其进行微优化?不,不可能。不过,您可以为初始值设定项字符串定义一个宏,并取其
sizeof
我的代码中有很多字符串比较@尤金尼什。你是什么意思?
#定义MYSTRING“Hello world”
然后
char const*string=MYSTRING
,然后你可以取
sizeof(MYSTRING)
记住文字字符串实际上是数组,你可以对文字字符串本身使用
sizeof
(如
sizeof“Hello world”-1
)。但是,如果您只有一个指向字符串中单个字符的指针,那么这就是您所拥有的,并且您无法在编译时以符合标准的方式获得长度。
DEF_STRINGVARS(hello, len, "Hello\0World")