社区
高通开发者论坛
帖子详情
C中不声明只定义的问题
zhangwenhai
2009-11-30 03:42:50
大家好,我在 A.c 文件中定义了一个函数 B(),没有在 A.h 文件中声明,在其他文件中用这个B函数,编译的时候为什么没问题啊? 在使用的时候 返回值就不正确了,(2005环境下)。 谢谢解答
...全文
2451
13
打赏
收藏
C中不声明只定义的问题
大家好,我在 A.c 文件中定义了一个函数 B(),没有在 A.h 文件中声明,在其他文件中用这个B函数,编译的时候为什么没问题啊? 在使用的时候 返回值就不正确了,(2005环境下)。 谢谢解答
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
HuaweiHr2012
2012-02-14
打赏
举报
回复
[Quote=引用 6 楼 zhangwenhai 的回复:]
引用 5 楼 ultrapro 的回复:
C中的标识使用时不需要声明的,不会影响编译,连接的时候会找这些东西的定义。
出现的错误可能是你用的函数的格式与你定义的不一样。
格式完全一样,我检测过了。 只要把这个函数在相应的头文件中 声明了,那个问题就没了。返回的值,真假都能分辨出来了。
[/Quote]
是不是 你定义的函数 和 标准库 函数重名了?如果没有在头文件中声明,且调用的.c中没有特别声明,应该有链接问题的。
如果不是上述问题,建议你重新全编译一下。
「已注销」
2011-10-25
打赏
举报
回复
学习了
senioryzc
2010-05-11
打赏
举报
回复
[Quote=引用 2 楼 chenmeimei_8899 的回复:]
没有出错时因为,编译的时候默认函数的返回值为int,所以当你的返回值不是int的时候就会出错
[/Quote]
补充下
从汇编语言或者机器指令的角度来看,函数要返回一个值,都是通过设置某个寄存器的值。然后调用函数的地方,读取这个寄存器来得到返回值。
以ARM为例,函数的返回类型为char,返回值为0,则设寄存器RO的低8位为0,高24位可能为0,也可能不为0.
调用函数处,因为你没有声明函数,所以认为RO为返回值。如果是做与0比较运算。那么即使你返回的是0(即设置RO低8为0)。但比较结果可能为真(R0高24位刚好为0),也可能为假(R0高24位刚好不为0)
adipreneo
2010-01-18
打赏
举报
回复
如果编译器设置合适,这种情况会至少报警,给出的提示信息就是如下所言。
[Quote=引用 8 楼 gaojinshan 的回复:]
引用 2 楼 chenmeimei_8899 的回复:
没有出错时因为,编译的时候默认函数的返回值为int,所以当你的返回值不是int的时候就会出错
同意你的说法!
[/Quote]
babiq
2010-01-12
打赏
举报
回复
查一下你是不是有同名函数
杭州山不高
2009-12-10
打赏
举报
回复
[Quote=引用 2 楼 chenmeimei_8899 的回复:]
没有出错时因为,编译的时候默认函数的返回值为int,所以当你的返回值不是int的时候就会出错
[/Quote]
同意你的说法!
bencharluo
2009-12-01
打赏
举报
回复
你的错误是在link的时候就出现的吧?编译的时候只会检查语法等等
路飞-总裁
2009-12-01
打赏
举报
回复
去C板块问下吧。。
zhangwenhai
2009-12-01
打赏
举报
回复
[Quote=引用 5 楼 ultrapro 的回复:]
C中的标识使用时不需要声明的,不会影响编译,连接的时候会找这些东西的定义。
出现的错误可能是你用的函数的格式与你定义的不一样。
[/Quote]
格式完全一样,我检测过了。 只要把这个函数在相应的头文件中 声明了,那个问题就没了。返回的值,真假都能分辨出来了。
儿大不由爷
2009-12-01
打赏
举报
回复
C中的标识使用时不需要声明的,不会影响编译,连接的时候会找这些东西的定义。
出现的错误可能是你用的函数的格式与你定义的不一样。
zhangwenhai
2009-12-01
打赏
举报
回复
编译链接的时候没有错,是在程序执行的时候出的错。 函数返回BOOL值,不论真、假,结果都返回 真。
当我把这个函数在 .H文件中 进行 声明了 执行结果就正确了。
FLYUP_CHEN
2009-11-30
打赏
举报
回复
没有出错时因为,编译的时候默认函数的返回值为int,所以当你的返回值不是int的时候就会出错
Longinc
2009-11-30
打赏
举报
回复
是可以调用的。但一般会extern一下。你那个返回值错误说具体点
C语言精彩编程100例
C语言入门教程:主要针对C语言初学者,从零讲解各个细节。
C语言
中
函数的
声明
和
定义
函数的
声明
和
定义
不是一回事,
声明
是把函数的名字、函数类型以及形参类型、个数和顺序写清楚,以致编译成功。函数的
定义
是对函数功能的确立,包括指定函数名,函数值类型、形参类型、函数体等。在c
中
有.h头文件和.c源文件,其
中
头文件放函数
声明
,源文件放函数
定义
。c语言
中
函数的
声明
和
定义
非常相似,导致很多人分不清这两者之间的关系。
必须知道的C语言知识细节:
声明
和
定义
C语言
中
的
声明
(declaration)和
定义
(definition)是两个容易混淆的概念。
声明
只是给变量、函数、结构体、联合体命名,表明程序有该变量、函数、结构体、联合体。
定义
是具体给变量分配存储空间、给出函数的具体实现、指明结构体和联合体成员。 简单理解:如果程序
中
仅仅有
声明
,缺少
定义
实现,最终无法生成可执行的程序,因为信息不完整,无法完成编译全过程。 C语言
中
声明
和
定义
的原则是:
声明
可以出现多次,
定义
有且只能出现一次。
定义
必须有,且只能出现一次。
声明
和
定义
可以同时出现。
声明
和
定义
可以分为以
C语言
中
声明
和
定义
的区别
声明
用于通知编译器有关变量或函数的信息而不分配内存,而
定义
不仅通知编译器还分配内存或提供具体实现。
定义
不仅告诉编译器变量、函数或类型的存在及其类型信息,还为其分配内存或提供具体实现。
声明
用于告诉编译器某个变量、函数或类型的存在及其类型信息,但并不为其分配内存。关键字来
声明
一个变量,表示这个变量是在其他地方
定义
的,这个需要调用。
声明
:通常出现在头文件
中
,允许其他文件知道变量或函数的存在。int func(int x, int y) { // 函数
定义
。2. 函数
定义
:提供函数的具体实现,即函数体。
C语言
中
,变量的
声明
与
定义
的区别
需要注意的是,在C语言
中
,变量的
定义
只能进行一次,但
声明
可以多次。这是因为多次
定义
会导致内存空间的重复分配,而多次
声明
则只是告诉编译器变量的存在,不会引起内存分配的
问题
。
声明
(Declaration)主要告诉编译器变量的名字和类型,但它并不为变量分配内存空间。
声明
的作用主要是让编译器知道变量的存在,以便在后面的代码
中
识别和使用它。它不仅告诉编译器变量的名字和类型,还会为变量分配内存空间。因此,
定义
是实际创建变量的地方。在C语言
中
,变量的
声明
和
定义
是两个相关但不完全相同的概念。
高通开发者论坛
2,851
社区成员
5,756
社区内容
发帖
与我相关
我的任务
高通开发者论坛
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
复制链接
扫一扫
分享
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能
物联网
机器学习
技术论坛(原bbs)
北京·东城区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章