【问题标题】:What causes an "incompatible implicit declaration" warning?是什么导致“不兼容的隐式声明”警告?
【发布时间】:2019-08-13 07:22:41
【问题描述】:

我正在尝试使用strlen() 函数找出字符串中的字符数。用户输入一个句子,代码必须显示字符串中的字符数。

int l;
char string[64];
printf("Enter a statement: \n");
scanf("%s",&string);
l = strlen(string);
printf("%d",l);

代码运行不正确并出现以下警告: [警告] 内置函数'strlen'的隐式声明不兼容

我确实在网上找到了正确的代码,但我的逻辑到底有什么问题?需要一点帮助。

【问题讨论】:

  • 标题是本题的第一个问题。 “将字符串传递给整数”是什么意思?它与问题的其余部分有何关系?
  • 您的代码不完整;特别是,它似乎缺少一个main() 函数和至少一个#include。请edit您的代码,这是您问题的minimal reproducible example(包括任何必要的输入,但最好不需要任何输入),然后我们可以尝试重现并解决它。您还应该阅读How to Ask。

标签: c strlen


【解决方案1】:

观察,首先

代码运行不正确并出现以下警告:[警告] 内置函数'strlen'的不兼容隐式声明

这是因为您没有包含strlen 的必要标头。

#include <string.h>

其次,这里:

scanf("%s",&string);

string是字符数组和数组名本身的地址,因此在扫描&amp;时不需要。

scanf("%s", string); /* remove & */

此外,请始终检查 scanf 等函数的返回值。查看scanf() 的手册页以了解它返回的内容。例如:

int ret = scanf("%s", string);
if (ret == 1) {
    /* success, proceed further */
}
else {
   /* proper error handling */
}

【讨论】:

  • &amp; 不是必需的,但它确实有效(数组的地址与其值相同,只是类型不同)。
【解决方案2】:

警告的原因是忘记包含 string.h

该警告的详细含义是,在 90 年代的旧 C 语言中,使用函数而不声明它是有效的。因此,如果您没有在找到声明的地方提供像 string.h 这样的相关标头,编译器就会“猜测”您想要的函数格式,并尝试在“行间”默默地声明函数。

编译器会隐含地给你这个:

int strlen (); // accepts any parameters

但真正正确的strlen声明是这样的:

size_t strlen (const char *s);

这些不是兼容的类型,因此会出现关于不兼容声明的警告。 strlen 函数的实际定义与后者匹配,但与前者不匹配,因此这是一个错误。

从 1999 年及以后,隐式函数声明已从 C 语言中删除,因为它们很危险。不过,gcc 编译器仍然允许使用过时的 C 风格,如果您以某种方式对其进行配置。

如果您是初学者,则应始终使用严格且符合标准的设置进行编译:

gcc -std=c11 -pedantic-errors -Wall -Wextra

这会将上述警告替换为错误,这很好,因为这是一个破坏程序的错误。

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 2010-11-01
    • 2013-11-27
    • 2011-02-21
    • 1970-01-01
    • 2015-03-18
    • 2013-12-01
    • 2018-03-17
    • 2012-06-15
    相关资源
    最近更新 更多