C语言定义抽象函数的定义域错误

首先,本文中讨论的例子采用C语言,而非C++语言。
使用示例分析这个问题:
#include&&stdio.h&
&&&&void&hello(int&a);&&void&hello(int&a,&int&b);&&&&void&hello(int&a)&&{&&&&&&printf(&hello,&%d\n&,&a);&&}&&&&void&main()&&{&&&&&&hello(1);&&}&&
#include &stdio.h&
void hello(int a);
void hello(int a, int b);
void hello(int a)
printf(&hello, %d\n&, a);
void main()
在这个例子中,hello()函数声明了两次,定义了一次。
VS2010的编译结果为:
xx.c(4): warning C4031: second formal parameter list longer than the first list
xx.c(7): warning C4029: declared formal parameter list different from definition
VC6的编译结果为:
xx.c(4) : warning C4031: second formal parameter list longer than the first list
xx.c(7) : warning C4029: declared formal parameter list different from definition
xx.c(13) : error C2198: 'hello' : too few actual parameters
#include&&stdio.h&
&&&&void&hello(int&a);&&void&hello(int&a,&int&b);&&&&void&hello(int&a)&&{&&&&&&printf(&hello,&%d\n&,&a);&&}&&&&&SPAN&style=&COLOR:&#ff0000&&void&hello(int&a,&int&b);&/SPAN&&&&&void&main()&&{&&&&&&hello(1);&&}&&
#include &stdio.h&
void hello(int a);
void hello(int a, int b);
void hello(int a)
printf(&hello, %d\n&, a);
void hello(int a, int b);
void main()
例子2比例子1多了一个函数声明(红色部分)。
在这个例子中,hello()函数声明了三次,定义了一次。
VS2010的编译结果为:
xx.c(4): warning C4031: second formal parameter list longer than the first list
xxc(7): warning C4029: declared formal parameter list different from definition
xx.c(11): warning C4031: second formal parameter list longer than the first list
xx.c(15): error C2198: 'hello' : too few arguments for call
VC6的编译结果为:
xx.c.c(4) : warning C4031: second formal parameter list longer than the first list
xx.c.c(7) : warning C4029: declared formal parameter list different from definition
xx.c(15) : error C2198: 'hello' : too few actual parameters
----------------------------------------------------------------------------------------------------------------------------------------
对比这两个例子,可以做出以下分析
1)在函数调用中,如果提供的参数数量小于函数原型(函数原型的确定,后面讨论)中要求的参数数量,则会报错“too few actual parameters”,在VS2010和VC6中均如此。
2)在存在多个函数声明、存在定义的情况下,如何确定函数原型?
有了(1)的分析结果,我们可以根据函数调用来确认函数原型,当不报错时,hello(int a)就是函数原型,报错时hello(int a, int b)才是函数原型。
具体分析过程不再讨论,说一下我粗略得到的结论:
同时存在多个函数声明和定义时,
在VS2010中,函数原型由所有声明(包含定义)中最后一条确定。
在VC6中,函数原型由所有声明(不包含定义)中的最后一条确定。
3)实际2)中的分析存在一个问题,“最后一条”,怎么算是最后一条,如果在函数调用后,还有函数声明呢?函数调用后的函数声明后还有函数调用呢?如何处理?
继续以实例分析.
#include&&stdio.h&
&&&&void&hello(int&a);&&void&hello(int&a,&int&b);&&&&void&hello(int&a)&&{&&&&&&printf(&hello,&%d\n&,&a);&&}&&&&void&hello(int&a,&int&b);&&&&void&main()&&{&&&&&&hello(1);&&}&&&&&SPAN&style=&COLOR:&#ff0000&&void&hello(int&a);&&&&void&callhello()&&{&&&&&&hello(1);&&}&/SPAN&&&
#include &stdio.h&
void hello(int a);
void hello(int a, int b);
void hello(int a)
printf(&hello, %d\n&, a);
void hello(int a, int b);
void main()
void hello(int a);
void callhello()
例子3中,在main()函数后,又增加了一个函数声明和函数调用。
VS2010编译结果如下(略去warning)
xx.c(15): error C2198: 'hello' : too few arguments for call
VC6编译结果如下(略去warning)
xx.c(15) : error C2198: 'hello' : too few actual parameters
VS2010和VC6处理一致,可以看到第一次hello()调用报错,第二次却没有报错。
这就说明,前后两次函数调用,用于检查函数调用是否正确的函数原型是不一样的:
我们很容易猜测到,用于检验函数调用的函数原型,是由源文件中、函数调用前、该函数的所有声明决定的。
可以继续验证:
#include&&stdio.h&
&&&&void&hello(int&a);&&void&hello(int&a,&int&b);&&&&void&hello(int&a)&&{&&&&&&printf(&hello,&%d\n&,&a);&&}&&&&void&hello(int&a,&int&b);&&&&void&main()&&{&&&&&&hello(1);&&}&&&&&SPAN&style=&COLOR:&#cc0000&&void&hello(int&a,&int&b);&/SPAN&&&&&void&callhello()&&{&&&&&&hello(1);&&}&&
#include &stdio.h&
void hello(int a);
void hello(int a, int b);
void hello(int a)
printf(&hello, %d\n&, a);
void hello(int a, int b);
void main()
void hello(int a, int b);
void callhello()
xx.c(15): error C2198: 'hello' : too few arguments for call
xx.c(22): error C2198: 'hello' : too few arguments for call
xx.c(15) : error C2198: 'hello' : too few actual parameters
xx.c(22) : error C2198: 'hello' : too few actual parameters
修改最后第2个hello()调用前的函数声明,第2个hello()调用也报错了。
结合上面的结论,可以得出:
同时存在多个函数声明和定义时,
用于检验函数调用的函数原型,是由源文件中、函数调用前、该函数的所有声明中的最后一条决定的;
在VS2010中,所有声明包含定义,在VC6中,所有声明不包含定义。
PS: 如果一个函数调用前,只存在这个函数的定义,那函数调用的检查肯定用函数定义中的函数原型,这一点要强调一下。
但是,同时,我们知道,函数原型不仅仅适用于函数调用的编译检查,还涉及到链接的问题。
不过在C语言中,对这方面,我们不需要太多考虑。因为链接依靠的是符号表,符号表中,函数的符号是由函数原型决定的。
但是C语言中没有name mangling机制,导致函数的符号实际只由函数名决定。
同样是一个例子:
&&#include&&stdio.h&
&&&&void&hello(int&a);&&&&void&main()&&{&&&&&&hello(1);&&}&STRONG&&&&/STRONG&&&
#include &stdio.h&
void hello(int a);
void main()
&&#include&&stdio.h&
&&&&void&hello(int&a,&int&b)&&{&&&&&&printf(&hello,&%d&%d\n&,&a,&b);&&}&&
#include &stdio.h&
void hello(int a, int b)
printf(&hello, %d %d\n&, a, b);
}1)后缀名为C,使用VS2010和VC6编译均正常,无报错。
2)如果修改后缀名为C++,再编译,
VS2010报错:
main.obj : error LNK2019: unresolved external symbol &void __cdecl hello(int)& (?hello@@YAXH@Z) referenced in function _main
xxxx.exe : fatal error LNK1120: 1 unresolved externals
main.obj : error LNK2001: unresolved external symbol &void __cdecl hello(int)& (?hello@@YAXH@Z)
xxxx.exe : fatal error LNK1120: 1 unresolved externals
从这一点来看,C语言对函数原型的检查机制,天然比不上C++的检查机制。
最后,再谈二个很有意思的东西。
1、旧式风格函数声明
#include&&stdio.h&
&&&&&&void&hello(int&a,&int&b)&&{&&&SPAN&style=&WHITE-SPACE:&pre&&&&/SPAN&printf(&hello,&%d,&%d\n&,&a,&b);&&}&&&&&&void&hello();&&&&&&void&main()&&{&&&SPAN&style=&WHITE-SPACE:&pre&&&&/SPAN&hello(1,&2);&&}&&
#include &stdio.h&
void hello(int a, int b)
printf(&hello, %d, %d\n&, a, b);
void hello();
void main()
hello(1, 2);
这个程序会不会编译通过呢?
根据我们上面得到的结论,VC6和VS2010,在检查hello(1,2)调用时,使用的是hello(),应该报错。
但是编译一下发现,程序正常通过编译,WHY?
这里涉及到一个旧式声明的问题。
void hello();既可以看成是一个旧式声明(只给出函数的返回类型),也可以看成没有参数的函数的新风格原型。
当然旧式声明早已经是垃圾堆里的东西了,但是编译器却要保证对旧式风格的兼容,因此hello()会被理解成一个旧式风格的声明。
SO.....void hello();不会影响到函数调用的检查。
我已经尝试过,在上面所有的例子中,随意添加void hello();不会影响编译结果的。
2、过多的函数参数
#include&&stdio.h&
&&&&void&hello(int&a)&&{&&&&&&printf(&hello,&%d\n&,&a);&&}&&&&void&main()&&{&&&&&&hello(1,&2);&&}&&
#include &stdio.h&
void hello(int a)
printf(&hello, %d\n&, a);
void main()
hello(1, 2);
上面什么情况??过多的函数参数,看一下编译结果把:
VS2010:(warning level3)
XX.C(10): warning C4020: 'hello' : too many actual parameters
VC6:(warning level3)
XX.C(10) : warning C4020: 'hello' : too many actual parameters
至少在:(warning level3)下,是仅有WARNING,没有报错的。
运行一下,也是正常的。
那修改后缀名为c++??
<span style="color:#&ClCompile:
1& &main.cpp
1&f:\prj_cs\c\try_0819\try_0819\main.cpp(10): error C2660: 'hello' : function does not take 2 arguments
d:\my documents\test\test0818\test.c(10) : warning C4020: 'hello' : too many actual parameters
Linking...
test.obj : error LNK2005: _main already defined in main.obj
main.obj : error LNK2001: unresolved external symbol &void __cdecl hello(int)& (?hello@@YAXH@Z)
Debug/test0818.exe : fatal error LNK1120: 1 unresolved externals
不太一样,一个编译就报错,一个链接才报错,但终究也是都报错了。
由此又印证了,C的一些天然能力不足~~~。
至于具体标准里如何规定的,后续有时间打算再研究一下标准。。。。
本文已收录于以下专栏:
相关文章推荐
c标准库中有这样的代码:
int tolower(int);
#define tolower(c) _Tolower[(int)(c)]在tolower.c中有这样的代码:
int (tolower)...
函数声明的发展1 隐式函数声明 implicit function declaration
main 函数和 printf 函数返回值类型为 int, 若不声明, 编译器默认函数返回值为 int 类型...
慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服...
首先,本文中讨论的例子采用C语言,而非C++语言。
使用示例分析这个问题:
void hello(int a);
void hello(int a, int b...
[原]详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!
&#160;&#160;&#160;&#160;&#160;&#160; 以前写单片机程序时总是把所用函...
详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则...
以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧!
&#160;&#160;&#160;&#160;&#160;&#160;&#160; 后来学会了在keil里进行模块化编程...
在将变量前,先解释一下声明和定义这两个概念。声明一个变量意味着向编译器描述变量的类型,但并不为变量分配存储空间。定义一个变量意味着在声明变量的同时还要为变量分配存储空间。在定义一个变量的同...
在将变量前,先解释一下声明和定义这两个概念。声明一个变量意味着向编译器描述变量的类型,但并不为变量分配存储空间。定义一个变量意味着在声明变量的同时还要为变量分配存储空间。在定义一个变量的同...
最近在看Redis代码,看到SDS字符串时,有个地方很诡异,代码如下:
static inline size_t sdslen(const sds s) {
struct sdshdr *sh...
他的最新文章
讲师:钟钦成
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)博客访问: 26913
博文数量: 2
博客积分: 66
博客等级: 民兵
技术积分: 180
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
& & 最近项目代码需要从mips平台移植到x86平台,这是公司产品第一次采用x86平台。之前项目很紧,所以很多代码都没有考虑移植性问题,因此移植的时候遇到了不少问题。前几天才解决了位序(也叫比特序,与字节序不同)问题,今天又遇到了一个比较隐蔽的C语言问题,在这里记录一下,告诫自己,也告诫各位同行,避免犯这样的错误。至于位序问题,以后应该会再另写一篇文章来说明。& & 原本在mips平台上运行良好的代码,移植到了x86平台,结果却不对了,我们仔细分析了代码,没发现什么可疑的地方,而且我之前为了优化那段代码,单独把那段代码抽出来测试过。我抽出来的代码在两个平台里得出的都是一样的结果。我对比了代码,实现的地方没有任何改动,照理说不应该出现这种情况的。不过根据打印出来的值,我注意到了一种情况,在x86平台里的结果值只有16位,但在mips平台里的结果值有32位,并且低16位的值与x86平台下的值一样。最后,我查看了声明该函数的头文件,才发现头文件里函数的声明与C文件里的实现返回值不一致!& & 问题可以简化成下面的代码://crc.c//注意,此处没有包含crc.h这个头文件!unsigned int get_crc(void){&&&&return 0x;}//crc.hunsigned short get_crc(void);//main.c#include <stdio.h>#include "crc.h"int main(int argc, char *argv[]){&&&&unsigned int crc = get_crc();&&&&printf("crc:%x\n", crc);&&&&return 0;}& & 编译执行: gcc -Wall -o test main.c crc.c &//好吧,-Wall也没办法报错& & 在x86平台下输出:5678& & 我又分别在mips平台和powerpc平台下编译执行了这段代码,同样没警告或者报错。在mips平台下输出:,在powerpc平台下输出:& & 在简化的代码里,大家很容易就能看出是get_crc这个函数的声明和定义(实现)不一致导致的问题,但在庞大的项目文件里,可能就没那么容易看出问题所在了。& & 我们在写代码的时候,往往只注意函数的实现,对函数的声明重视不足。在Linux平台下,我们喜欢用cscope+ctags+vim来写代码,修改或者浏览代码的时候也喜欢跳到函数定义处,变量声明处,却很少关注函数声明,导致修改代码之后声明和定义不一致的情形。& & 这并不只是程序新手才会出现的问题,工作几年的程序员也可能会犯这样的错误,出现问题的这段代码,就是出自一个已经工作了四年的同事之手。& & 也正是在这个时候,我才发现,我们之前的代码是有问题的,只是所谓的“得到了正确的结果”。& & 我起先认为对于这种情况,是个编译器未定义形为,不同gcc版本对这种情况的处理可能不一样,但我进行了一些测试,发现情况比我想象中的复杂。在powerpc平台,gcc版本是3.3.x,mips平台,gcc版本是4.3.x,在x86平台,有两个版本的编译器,分别为4.1.x(centos),4,6.x(ubuntu)执行情况是mips平台和powerpc平台一样,都是,x86平台下均为5678。mips和powerpc都是大端,x86是小端,至令我没办法判断真正的问题在哪,是编译器版本原因还是与大小端有那么点关系。还望知道的朋友不吝赐教。& & 此外,我还测试了对于变量的情况,发现对于变量的处理,各个gcc版本不同平台都是一致的,当然,由于大小端的关系,输出结果会不同。大家有兴趣可以试一下。& & 说了那么多,只是想说明这个隐蔽的错误大家一不小心就很容易犯,而且后果也比较严重,得找到方法避免。& & 解决办法很简单,那就是通过把函数声明(原型)放在头文件中,而函数定义则放在另一个包含了该头文件的源文件中。这样编译器就能发现不一致的情况从而报错提醒我们。这个问题在《C专家编程》8.5节有论述。& & 我单独提出来的代码之所以结果一致,是因为我把函数定义跟对该函数的引用都放一个文件中了,没有使用头文件。&& &4月18日补充:由于之前mips平台和x86平台gcc版本不一样,没有可比性,今天到公司换了一样的gcc版本进行测试,发现mips平台下还是输出,这看来应该是编译器后端的行为,有时间看下mips汇编确认一下吧。
阅读(2239) | 评论(0) | 转发(0) |
上一篇:没有了
相关热门文章
给主人留下些什么吧!~~
请登录后评论。新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
丰衣足食, 积分 877, 距离下一级还需 123 积分
论坛徽章:0
我的函数都是在lib库里定义,然后在程序里调用,但是在编译时出现“implicit declaration of function”错误,如何解决?谢谢!
丰衣足食, 积分 877, 距离下一级还需 123 积分
论坛徽章:0
/bin/sh ./libtool --tag=CC& &--mode=link gcc -Wall -Wwrite-strings -Werror -std=
gnu99 -D_GNU_SOURCE -D_REENTRANT -g -O2& &-o dffserver server.c libjson.la -L./
程序我是这样编译的,函数在libabctcp.a中,是不是libabctcp.a也要变成la啊?
富足长乐, 积分 5047, 距离下一级还需 2953 积分
论坛徽章:0
调用的时候包含你的函数原型声明,再说了那个只是一个warning,你的错误在其他地方
丰衣足食, 积分 877, 距离下一级还需 123 积分
论坛徽章:0
调用的时候包含你的函数原型声明,再说了那个只是一个warning,你的错误在其他地方
churchmice 发表于
& & 出错信息如下:
yzfs.h:24: warning: missing braces around initializer
yzfs.h:24: warning: (near initialization for `wlog.pass')
server.c: In function `main':
server.c:31: warning: implicit declaration of function `daemon_procedure'
server.c:33: warning: implicit declaration of function `server_socket'
server.c:42: warning: implicit declaration of function `accept_procdure'
server.c:50: warning: implicit declaration of function `YZFSServ'
server.c:53: warning: implicit declaration of function `close'
server.c: In function `YZFSServ':
server.c:86: warning: implicit declaration of function `read_socket'
server.c:109: warning: implicit declaration of function `write_socket'
server.c:61: warning: unused variable `my_string'
server.c:61: warning: unused variable `my_int'
server.c:61: warning: unused variable `my_array'
server.c:62: warning: unused variable `ret'
server.c:63: warning: unused variable `tmpbuf'
小富即安, 积分 4979, 距离下一级还需 21 积分
论坛徽章:0
很明显,没包含头文件
丰衣足食, 积分 877, 距离下一级还需 123 积分
论坛徽章:0
因为是测试程序,一些无用的变量没有删除,现在改了一下,编译后,出错信息如下:
server.c: In function `main':
server.c:31: warning: implicit declaration of function `daemon_procedure'
server.c:33: warning: implicit declaration of function `server_socket'
server.c:42: warning: implicit declaration of function `accept_procdure'
server.c:50: warning: implicit declaration of function `YZFSServ'
server.c:53: warning: implicit declaration of function `close'
server.c: In function `YZFSServ':
server.c:83: warning: implicit declaration of function `read_socket'
server.c:106: warning: implicit declaration of function `write_socket'
丰衣足食, 积分 877, 距离下一级还需 123 积分
论坛徽章:0
很明显,没包含头文件
c/unix 发表于
& & 我以前都是在SCO中用C开发,这样的程序没有问题,为什么在LINUX上就出错了呢?头文件在哪里加?
小富即安, 积分 4979, 距离下一级还需 21 积分
论坛徽章:0
这么说,没有头文件啊。
对于那些报警的函数,那就在.c文件前面加上extern 函数原型。
富足长乐, 积分 5047, 距离下一级还需 2953 积分
论坛徽章:0
把-Werror去掉
白手起家, 积分 43, 距离下一级还需 157 积分
论坛徽章:0
具體是去掉-Werror-implicit-function-declaration
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处一个C语言函数声明和定义的编译问题 - CSDN博客
一个C语言函数声明和定义的编译问题
最近在看Redis代码,看到SDS字符串时,有个地方很诡异,代码如下:
static inline size_t sdslen(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh-&
static inline size_t sdsavail(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh-&
sds sdsnewlen(const void *init, size_t initlen);
sds sdsnew(const char *init);
sds sdsempty(void);
&span style=&color:#ff0000;&&size_t sdslen(const sds s);&/span&
sds sdsdup(const sds s);
void sdsfree(sds s);
size_t sdsavail(const sds s);
sds sdsgrowzero(sds s, size_t len);
sds sdscatlen(sds s, const void *t, size_t len);
sds sdscat(sds s, const char *t);
sds sdscatsds(sds s, const sds t);
sds sdscpylen(sds s, const char *t, size_t len);
sds sdscpy(sds s, const char *t);
先是定义了一个内联函数,然后又声明了一个同名的函数,这样不会有问题吗?
根据验证,说明后面的声明是无效的,sds.c文件中没有sdslen的实现,如果有就会重定义错误。用的时候都是调用的内联函数。
测试代码如下:
test.h文件
#include &stdio.h&
static inline void testA()
printf(&static inline testA!\n&);
void testA(); // 不能实现,否则重定义,可以声明,无用
void testB(); // 可以不实现,不实现则不能调用,否则链接不到
test.c文件
#include &test.h&
// void testA()
main函数:
#include &test.h&
void main()
testA(); // inline 函数展开
// testB(); 不能调用
估计是源代码优化未删除原有声明导致的吧。
本文已收录于以下专栏:
相关文章推荐
变量声明和变量定义
变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
变量声明:用于向程序表明变量的类型和名字。
定义也是声明,extern声明不是定义
函数声明的发展1 隐式函数声明 implicit function declaration
main 函数和 printf 函数返回值类型为 int, 若不声明, 编译器默认函数返回值为 int 类型...
关于C语言函数的原型声明与函数定义,这里涉及了许多的内容,以此文章,记录自己所了解的知识,以备日后查阅,同时也帮助自己和大家了解这当中暗含的“陷阱”。由于历史的原因,C语言的函数声明有旧式和新式之分,...
1>d:\myworkfiles\c++project\learn929\learn929\manfunction.cpp(4) : error C2533: “Man::{ctor}”: 构造函数不...
4 wxWidgets学习资料及利用方法指导  初学者常苦于找不到参考资料。实际上,是找不到,不是没有。真正有用的资料,常常也就在手边,只是不知道。有能力熟练地使用一切能用得着的资料,这是水平提高的指...
1 什么是C语言的隐式函数声明在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下面是一个例子:int main(int a...
首先,本文中讨论的例子采用C语言,而非C++语言。
使用示例分析这个问题:
void hello(int a);
void hello(int a, int b...
c语言中函数声明方式,以及相关的问题,通过实例讲解不同情况下构建函数产生的问题。...
###############################例子全部来源于谭浩强版c语言####################################
在a.c文件里c函数的原型为:
char* function();
在另外的b.c文件里没有引用a.c对应的头文件,即没有function的函数原型声明,直接调用此上面的c函数:
char* ret...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 对数函数的定义域 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信