是否可以strlen()
在C预处理器中实现?
鉴于:
#define MYSTRING "bob"
是否有一些预处理器宏,X
让我说:
#define MYSTRING_LEN X(MYSTRING)
是否可以strlen()
在C预处理器中实现?
鉴于:
#define MYSTRING "bob"
是否有一些预处理器宏,X
让我说:
#define MYSTRING_LEN X(MYSTRING)
它不使用预处理器,但 sizeof 在编译时被解析。如果你的字符串在一个数组中,你可以在编译时使用它来确定它的长度:
static const char string[] = "bob";
#define STRLEN(s) (sizeof(s)/sizeof(s[0]))
请记住,STRLEN
上面将包含空终止符这一事实,与strlen()
.
你可以做:
#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 字符。
是的:
#define MYSTRING_LEN(s) strlen(s)
在大多数编译器中,这将为常量参数生成一个编译时常量......你不能做得比这更好。
换句话说:您不需要宏,只需使用 strlen;编译器足够聪明,可以为您完成工作。
通常,C 预处理器实际上并不转换任何数据,它只是替换它。这意味着您可能能够执行这样的操作,前提是您使用数据实现(功能)持久数据结构污染您的 C 预处理器命名空间。
也就是说,你真的不想这样做,因为一旦你传入字符串以外的东西,整个“添加”的功能就会失败。C 预处理器没有数据类型的概念,也没有内存取消引用的概念(如果您想要存储在变量中的字符串的长度很有用)。基本上,这将是一个有趣的“看看你能走多远”的练习,但最后,你会有一个 MYSTRING_LEN ,它只会带你到目标的一小段距离。
此外,C 预处理器缺少名称空间意味着这样的宏扩展系统是不可包含的。必须注意防止生成的名称干扰其他有用的宏。最后,您可能会因为任何重要用途而耗尽预处理器中的内存,因为预处理器并不是真正构建为保存每个被转换为“单位”标记的字符的名称,以及一个名称对于每个“单位”令牌被压缩为其最终十进制表示法。