【问题标题】:C compiler: "Types 'char *' and 'int' are not assignment-compatible" - but there's no int?C 编译器:“类型 'char *' 和 'int' 不是赋值兼容的” - 但是没有 int?
【发布时间】:2011-10-15 04:26:48
【问题描述】:

我正在将 FOSS 包移植到 HP-UX。我遇到了一个编译器警告,我只是想不通。我应该注意我使用的是 HP-UX 捆绑的免费 /usr/bin/cc,而不是购买的附加编译器,以使该软件包尽可能广泛地使用。

编译(只是没有标志的 cc)说:

Warning 942: "grep.c", line 288 # Types 'char *' and 'int' are not assignment-compatible.
        if ((fname = strsep(&lp, ":")) == NULL)
             ^^^^^^^^^^^^^^^^

在该函数中声明了fname:

    char    *fname, *line, *lp, *ln;

所以 fname 是一个字符指针。这就是 strsep() 返回的内容:

char *strsep(char **stringp, const char *delim) {

strsep 包含在 OpenBSD 中:http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/string/strsep.c?rev=1.6;content-type=text%2Fplain

所以...strsep 返回一个字符指针,这就是 fname 的含义。 strsep 只能返回一个字符指针或 NULL。那么所有这些中的“int”在哪里?

【问题讨论】:

    标签: c


    【解决方案1】:

    您的#include 是否有正确定义strsep() 的头文件?如果不是,那么传统的做法是假设函数返回 int,这可能是导致您的问题的原因。

    【讨论】:

    • 具体来说,你需要#include <string.h>。 (strsep() 是一种 BSD 主义,未由 C 标准定义,但当它可用时,它会在 <string.h> 中声明。)
    • ABCD 做到了。创建一个 .h 并包含它可以立即解决问题。很有意思!我从来不知道这是传统的默认设置。感谢您的帮助和教育。
    【解决方案2】:

    我猜你的头文件根本没有声明strsep,因为它是非标准的,这会导致编译器假设它返回int,这是你的错误。尝试将-D_BSD_SOURCE 添加到您的编译器选项中(或将其隔离为仅适用于string.h。如果这不起作用,请通过系统标题(或手册页)查找是否有@987654327 的原型@ 任何地方,以及你需要什么样的宏舞蹈。作为最后的手段(假设你的 libc 中有它)你可以自己制作原型。

    另外,我认为您可以用标准的strtok 替换strsep,并对周围的代码进行一些修改。它们的用途相同,但界面略有不同。

    【讨论】:

    • strsepstrtok 不兼容。
    • mu,ABCD 打败了你,但是是的,问题是编译器假定它找不到函数定义的默认值。
    • @R..:几乎兼容,它们都是分词器,但界面有点不同,但您应该能够毫不费力地将其移植到 strtok。如果您正在处理使用 BSDisms 的东西,那么您可能不必担心线程(如果您将两者混合使用,您将得到您应得的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多