我在bstrlib.c
中找到了bstrlib中的以下代码(例如第193行):
bstring bfromcstr (const char * str) {
bstring b;
int i;
size_t j;
if (str == NULL) return NULL;
j = (strlen) (str);
i = snapUpSize ((int) (j + (2 - (j != 0))));
if (i <= (int) j) return NULL;
b = (bstring) bstr__alloc (sizeof (struct tagbstring));
if (NULL == b) return NULL;
b->slen = (int) j;
if (NULL == (b->data = (unsigned char *) bstr__alloc (b->mlen = i))) {
bstr__free (b);
return NULL;
}
bstr__memcpy (b->data, str, j+1);
return b;
}
(strlen) (str)
行是什么意思?这种使用strlen
的代码在bstrlib.c
中非常常见。
我在OSX机器上做了一些测试代码,但我既不理解也不解释它的含义。
答案 0 :(得分:11)
j = (strlen) (str);
与j = strlen(str);
基本相同。
按照他们的方式编写代码将确保使用真实的 strlen
函数(来自<string.h>
),即使它是隐藏名为strlen()
的{{3}}。
类似函数的宏只有在其名称后面带有一对括号后才会展开。如果你只是写下这个名字,那就不管它了。当你有一个函数和一个同名的宏,并且你希望有时使用该函数时,这可能很有用。
因为在(strlen) (str)
中,strlen
后面没有一对括号,所以宏不会被扩展。
此示例应演示:
#include <stdio.h>
#include <string.h>
/**
* Only check something like this in if you're
* planning on changing jobs very soon!
*/
#define strlen(s) 666
int main(void)
{
const char *str = "Stack Overflow";
size_t j;
/* This always uses the *real* strlen */
j = (strlen) (str);
fprintf(stderr, "(strlen) (str) = %zu\n", j);
/* This might be using a function-like macro */
j = strlen(str);
fprintf(stderr, "strlen(str) = %zu\n", j);
return 0;
}
<强>输出:强>
$ ./a.out
(strlen) (str) = 14
strlen(str) = 666
当然,以下内容也会起作用:
#include ...
...
#ifdef strlen
#undef strlen
#endif
答案 1 :(得分:4)
当在表达式中使用时,函数可以像数组一样用作指针。因此,strlen(str)
相当于(strlen)(str)
,(*strlen)(str)
和(******strlen)(str)
。