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

时间:2015-03-16 02:35:28

标签: c string

我在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机器上做了一些测试代码,但我既不理解也不解释它的含义。

2 个答案:

答案 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)