我发现下面的代码从bstrlib,在bstrlib.c(例如,线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;
}
Run Code Online (Sandbox Code Playgroud)
这条线(strlen) (str)是什么意思?这种代码使用strlen在很常见bstrlib.c.
我在OSX机器上做了一些测试代码,但我既不理解也不解释它的含义.
Jon*_*art 11
j = (strlen) (str);与...基本相同j = strlen(str);.
编写代码,他们确实将确保的方式实 strlen(从功能<string.h>)将被使用,哪怕是隐藏通过 函数宏命名strlen().
类似函数的宏只有在其名称后面带有一对括号时才会展开.如果你只是写下这个名字,那就不管它了.当您有一个功能和同名的宏,并且您希望有时使用该功能时,这可能很有用.
因为在(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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./a.out
(strlen) (str) = 14
strlen(str) = 666
Run Code Online (Sandbox Code Playgroud)
当然,以下内容也会起作用:
#include ...
...
#ifdef strlen
#undef strlen
#endif
Run Code Online (Sandbox Code Playgroud)