c语言函数声明和定义中,声明调用函数和定义变量有先后顺序吗

C/CPP(5)
项目中经常遇到C++和C语言混编的情况,例如性能要求必须使用C语言实现功能,开发要求使用C++实现界面。这种情况下,会出现很多C++和C混编问题,下面就我自己的项目经验谈谈可能遇到的问题和解决方法,如果有误或不当之处还请海涵并请不吝指教。
问题及解决
出现问题的根源主要包含以下两方面:
C++和C使用不同的编译器,而编译器对变量和函数有不同的符号表示方法;
C++是C的升级,对C有很多扩展,而这些扩展C不适用;
变量和函数
C++和C有不同的编译器,二者对变量名有不同的符号表示,例如对函数
int add(int a, int b);
C编译器对以上两个函数编译的结果可能都是_add,因而C无法函数重载,而C++编译器为了实现函数重载编译的结果可能是
add@@XBJJJ@D
add@@XCJJJ@D
因此C++调用C语言编译的函数或变量时无法找到符号对应的函数或变量。解决方法就是extern “C”,具体写法如下:
#ifdef __cplusplus
extern "C"
#ifdef __cplusplus
extern "C"的原理网上有很多解释,在这里不再赘述。
bool类型定义和使用
标准C中没有bool类型的定义,而C++中定义了bool类型,因此在混编中C源文件会出现类似于“bool,true和false未定义”的错误。解决方法如下:
#ifndef __cplusplus
VS环境下混编预编译头
Visual Studio环境下有默认的预编译头stdafx.h,C++工程中加入C源文件时,默认也会使用stdafx.h与编译头,编译无法通过
error C1853:“xxx.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C中使用它(或相反)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9783次
排名:千里之外
原创:19篇
转载:16篇
(4)(1)(1)(4)(1)(24)在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。1. extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明extern int v,还取决于变量v本身是能够被引用到的。这涉及到c语言的另外一个话题--变量的作用域。能够被其他模块以extern修饰符引用到的变量通常是全局变量。还有很重要的一点是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在函数fun作用域中引用v罢了,这还是变量作用域的问题。对于这一点来说,很多人使用的时候都心存顾虑。好像extern声明只能用于文件作用域似的。2. extern修饰函数声明。从本质上来讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c需要引用b.c中的函数,比如在b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使用fun来做任何事情。就像变量的声明一样,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范围中。对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。使用extern和包含头文件来引用函数有什么区别呢?extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这大概是KISS原则的一种体现吧!这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。3. 此外,extern修饰符可用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。
最新教程周点击榜
微信扫一扫C语言(176)
全局变量和局部变量的区别:通过调用函数举例a.全局变量申明位置在所有代码块之外,不存储于堆栈,作用域为从申明到文件尾,如果申明为static,不允许从其他文件访问b.局部变量申明位置在代码块起始处,存储于堆栈,作用域为整个代码块,如果申明为static,变量不存储于堆栈中,他的值在整个程序的执行期一直保持c.形式参数申明位置在函数头部,存储于堆栈,作用域为整个函数,不允许申明为static程序1:#include&stdio.h&static&int&m;void&fun1(){static&int&n&=&0;//静态局部变量n++;printf("n=%d\n",n);}void&fun2(){&&&&m&=&0;//全局变量m++;printf("m=%d\n",&m);}&int&main(){int&i;for&(i&=&0;&i&&&5;&i++){fun1();}return&0;}局部变量结果:n=1n=2n=3n=4n=5请按任意键继续.&.&.程序2:#include&stdio.h&static&int&m;void&fun1(){static&int&n&=&0;//静态局部变量n++;printf("n=%d\n",n);}void&fun2(){&&&&m&=&0;//全局变量m++;printf("m=%d\n",&m);}&int&main(){int&i;for&(i&=&0;&i&&&5;&i++){/*fun1();*/fun2();}return&0;}全局变量结果:m=1m=1m=1m=1m=1请按任意键继续.&.&.本文出自 “” 博客,请务必保留此出处
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:84262次
积分:1119
积分:1119
排名:千里之外
原创:257篇
评论:12条
(1)(4)(1)(7)(15)(10)(3)(221)温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
乐于分享,勤于学问
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(2928)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'【原】C语言中变量的定义要放在所有执行语句的最前面吗?',
blogAbstract:'\n&C89规定,在任何执行语句之前,在块的开头声明所有局部变量。\n在C99以及C++中则没有这个限制,即在首次使用之前,可在块的任何位置都可以声明变量。\n【引用讨论帖】
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}下载作业帮安装包
扫二维码下载作业帮
1.75亿学生的选择
C语言中,如何定义一个变量,使其既可以在主函数中使用,也可以在子函数中使用
把变量定义在主函数之外,即把变量设置为全局的.一般我们都把变量的定义放在函数中,因此变量的范围就是在本函数中.可是如果定义在所有函数的外面,这样所有的函数中,都可以使用本变量.你可以试一下这个程序.定义一个全局变量a,在主函数中进行赋值,然后在子函数中进行输出,结果是5.#include&stdio.void func();//函数声明int main(){ a=5; func();}void func(){ printf("%d\n",a);}+++++++++++++++++++++++++++++++++++++++++++++++++++当然,除了定义全局变量这个方法,还有其他的方法,那就是指针.在子函数的参数中传递变量的地址,依然可以使用该变量,依然能够改变该变量的值.比如下面这个程序,在主函数中a的值为5,将变量a的地址传递过去,子函数将该地址中的变量的值设置为3,然后主函数输出,结果却是3.#include&stdio.hvoid func(int *b);//函数声明int main(){ int a=5; func(&a);//把变量a的地址传递过去 printf("%d\n",a);}void func(int *b){ *b=3; //将地址b中变量的值设置为3}
为您推荐:
其他类似问题
扫描下载二维码

我要回帖

更多关于 c语言变量声明和定义 的文章

 

随机推荐