34

是否可以strlen()C预处理器中实现?

鉴于:

#define MYSTRING "bob"

是否有一些预处理器宏,X让我说:

#define MYSTRING_LEN X(MYSTRING)
4

4 回答 4

41

它不使用预处理器,但 sizeof 在编译时被解析。如果你的字符串在一个数组中,你可以在编译时使用它来确定它的长度:

static const char string[] = "bob";
#define STRLEN(s) (sizeof(s)/sizeof(s[0]))

请记住,STRLEN上面将包含空终止符这一事实,与strlen().

于 2011-02-16T21:08:07.617 回答
9

你可以做:

#define MYSTRING sizeof("bob")

这在我的机器上说 4,因为最后添加了 null 。

当然,这只适用于字符串常量。


使用 MSVC 16 ( cl.exe -Wall /TC file.c) 这个:

#include "stdio.h"
#define LEN_CONST(x) sizeof(x)

int main(void)
{
    printf("Size: %d\n", LEN_CONST("Hej mannen"));

    return 0;
}

输出:

Size: 11

字符串的大小加上 NUL 字符。

于 2011-02-16T21:10:30.027 回答
5

是的: #define MYSTRING_LEN(s) strlen(s)

在大多数编译器中,这将为常量参数生成一个编译时常量......你不能做得比这更好。

换句话说:您不需要宏,只需使用 strlen;编译器足够聪明,可以为您完成工作。

于 2011-02-17T00:22:18.790 回答
0

通常,C 预处理器实际上并不转换任何数据,它只是替换它。这意味着您可能能够执行这样的操作,前提是您使用数据实现(功能)持久数据结构污染您的 C 预处理器命名空间。

也就是说,你真的不想这样做,因为一旦你传入字符串以外的东西,整个“添加”的功能就会失败。C 预处理器没有数据类型的概念,也没有内存取消引用的概念(如果您想要存储在变量中的字符串的长度很有用)。基本上,这将是一个有趣的“看看你能走多远”的练习,但最后,你会有一个 MYSTRING_LEN ,它只会带你到目标的一小段距离。

此外,C 预处理器缺少名称空间意味着这样的宏扩展系统是不可包含的。必须注意防止生成的名称干扰其他有用的宏。最后,您可能会因为任何重要用途而耗尽预处理器中的内存,因为预处理器并不是真正构建为保存每个被转换为“单位”标记的字符的名称,以及一个名称对于每个“单位”令牌被压缩为其最终十进制表示法。

于 2011-02-16T21:13:27.677 回答