c语言难道可以不包含头文件,就直接使用函数?

chouxiaoya8100 2015-08-01 02:48:21
我是用vs2013

刚才又发现一个奇怪的语法,注意,所有代码都是纯c


我用到了strlen string.h里的一些函数,

注意:我没有包含string.h

居然可以编译过去,但是有警告:

Warning 29 warning C4013: 'strlen' undefined; assuming extern returning int
Warning 30 warning C4013: 'memcpy' undefined; assuming extern returning int
Warning 31 warning C4013: 'strcat' undefined; assuming extern returning int


当然你们肯定不信,我也不信,是啊,头文件都不包含,能编译就见鬼了。

为此我新建一个工程,试一试,果然无法编译。

那么,为什么我的老工程可以编译,只简单的出现警告呢?


为此,通过搜索来解答问题:

http://bbs.csdn.net/topics/110078687

看这个帖子,我居然没看懂。

擦, 没头文件,只是警告?


这是什么理由?

百思不得其解






https://msdn.microsoft.com/zh-cn/library/d3ct4kz9.aspx

Visual Studio 2013 其他版本
“function”未定义;假设外部返回 int
编译器遇到对未定义函数的调用。
通过检查以下可能的原因进行修复
函数名称拼写不正确
原型非 extern 的外部函数

这是我从msdn获取到的信息,依然不懂啥意思?

我只知道,你妹包含, 丫的,编译器怎么能放过去呢?


c/c++编译器对这种问题,是如何处理的?
...全文
3606 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
LubinLew 2015-08-01
  • 打赏
  • 举报
回复 1
楼上都说的很详细了,这是编译器帮你做的事,默认包含常用的头文件(正确的说,应该是链接,对于找不到的符号,到常用库中搜一下),说白了就是让你写代码方便一些,想一想你写这么多程序,有几个是不用printf等常用的函数,不过推荐是包含的, 一般都要做到没有warning,这对代码排错和后期维护很重要。
lm_whales 2015-08-01
  • 打赏
  • 举报
回复
没有用到的函数不连接,很正常啊。 不连接,也就不用考虑,是否有连接错误了。 这是C语言(连接器)的重要功能,可以减小代码大小。 printf ,和 scanf 这两个函数,可以不必include 任何头文件,直接用 这在早期的编译器,是很平常的事情 因为任何有点意义的完整的简单程序,都离不开输入输出。,,,, (复杂程序,可以借助各种类型的通讯手段,DLL等等,不必直接输入输出,这里不谈) 所以开了特例,方便学习C语言的时候,使用这两个函数。
chouxiaoya8100 2015-08-01
  • 打赏
  • 举报
回复
test.h:
int a;

void show();

#define  BUFSIZE 100
test1.c:
#include "test.h"
#include <stdio.h>
int fun()
{

	printf("Hello World\n");
	return 0;

}

void show()
{

}
test2.c:
#include<stdio.h>

#include "test.h"
#include "test.h" //注意我故意写了2行

int  main(void)

{
	//return 0;

	//printf("%s", a);
}
也可以编译链接。 顿时崩溃!!! 用gcc试试,结果也如此,人生信念彻底毁灭。
chouxiaoya8100 2015-08-01
  • 打赏
  • 举报
回复
为了再次看c和c++的区别,做个实验: test.h: int a; void show(void); test1.c:
#include "test.h"
#include <stdio.h>
int fun()
{

	printf("Hello World\n");
	return 0;

}

void show()
{

}
test2.c:
#include<stdio.h>

#include "test.h"

int  main(void)

{
	//return 0;


}
毫无压力,编译。链接都没错误,且无警告。 看到变量 int a没有!!!! 确实让我吃了一惊。
苏叔叔 2015-08-01
  • 打赏
  • 举报
回复
有些库会被编译器自动链接 再加上楼上的说法, 即是解释
chouxiaoya8100 2015-08-01
  • 打赏
  • 举报
回复
gcc 试试: #include <stdio.h> int main() { printf("Hello World!\n"); strlen("123"); return 0; } warning: incompatible implicit declaration of built-in function ‘strlen’ 答案已经知晓。 c和c++有个区别: 后者严格申明后使用。 前者,编译器去猜测且假设函数为 int strlen(void)。 当链接的时候,编译器在c库函数里找到了strlen,所以就成功了。 可见c语言非常恐怖!!!
2015-08-01
  • 打赏
  • 举报
回复
应该是编译器问题吧
chouxiaoya8100 2015-08-01
  • 打赏
  • 举报
回复
up 起来
chouxiaoya8100 2015-08-01
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/391380244 这是姊妹篇

70,014

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧