"int j =(strlen)(str)"是什么意思?

teo*_*eok 3 c string

我发现下面的代码从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)