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