易截截图软件、单文件、免安装、纯绿色、仅160KB

C/C++中重复定义的问题


用#include可以包含其他头文件中变量、函数的声明,为什么还要extern关键字,如果我想引用一个全局变量或
函数a,我只要直接在源文件中包含#include<xxx.h>
(xxx.h包含了a的声明)不就可以了么,为什么还要用extern呢??这个问题一直也是似是而非的困扰着我许多年了,今天上网狠狠查了一下总算小有
所获了:
头文件
首先说下头文件,其实头文件对计算机而言没什么作用,她只是在预编
译时在#include的地方展开一下,没别的意义了,其实头文件主要是给别人看的。
我做过一个实验,将头文件的后缀改成xxx.txt,然后在引用该头文件的地方用
#include"xxx.txt"
编译,链接都很顺利的过去了,由此可知,头文件仅仅为阅读代码作用,没其他的作用
了!
不管是C还是C++,你把你的函数,变量或者结构体,类啥的放在你的.c或者.cpp文件里。然后编译成
lib,dll,obj,.o等等,然后别人用的时候 最基本的gcc hisfile.cpp yourfile.o|obj|dll|lib 等等。

对于我们程序员而言,他们怎么知道你的lib,dll...里面到底有什么东西?要看你的头文件。你的头文件就是对用户的说明。函数,参数,各种各样的接
口的说明。
   
那既然是说明,那么头文件里面放的自
然就是关于函数,变量,类的“声明
”了。记着,是“声明”,
不是“定义”。
那么,我假设大家知道声明和定义的
区别。所以,最好不要傻嘻嘻的在头文件里定义什么东西。比如全局变量:
/*xx头文件*/
#ifndef _XX_头文件.H
#define _XX_头文件.H
int A;
#endif
那么,很糟糕的是,这里的int
A是个全局变量的定义,所以如果这个头文件被多次引用的话,你的A会被重复定义
显然语法上错了。只不过有了这个#ifndef的条件编译,所以能保证你的头文件只被引用一
次,不过也许还是会岔子,但若多个c文件包含这个头文件时还是会出错的,因为宏名有效范围仅限于本c源文件,所以在这多个c文件编译时是不会出错的,但在
链接时就会报错,说你多处定义了同一个变量,
Linking...
incl2.obj : error
LNK2005: "int glb" (?glb@@3HA
) already
defined in incl1.obj
Debug/incl.exe : fatal error LNK1169: one
or more multiply defined symbols found
注意!!!
extern
这个关键字
真的比较可恶,在声明的时候,这个extern居然可以被省略,所以会让你搞不清楚到底是声明还是定义,下面分变量和


相关文档:

C/C++开发经验人才请进!

上周老板分下来6个职位软件开发方面的职位给我,要我按职位要求寻找合适的人才。居然是C/C++!据我所知,在人才库中,JAVA 人才倒是应有尽有,学C的,还是嵌入式开发的可真的好少啊。我又不是女娲,难道我会造人才么?要求条件还这么高!
以下是大连软件园几家知名外企委托我们招聘的职位信息。
Position 1 软件开发工程师 ......

C Traps and Pitfalls 读书摘记

用单引号引起的一个字符实际上代表一个整数,整数值对应于改字符在编译器采用的字符集中的序列值。
用双引号引起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符'\0'初始化。
printf("Hello world\n");

char hello[] = {'H', 'e', 'l', 'l', 'o', ' ' ......

PRO*C编程中出现的错误


1. linux下启动oracle
su - oracle
sqlplus /nolog
conn /as sysdba
startup
exit
lsnrctl start
exit
2. linux下关闭oracle
su - oracle
sqlplus /nolog
conn /as sysdba
shutdown immediate
exit
lsnrctl stop
exit
3、启动监听器
oracle@suse92:~> lsnrctl start
4、停止监听器
oracle@suse92:~ ......

"extern C", 你真的懂了吗?

       在c++ prime书中看到过,在DLL和lib中看到过,但是每次看过就不求甚解地一扫而过。心里知道有extern c这个语句,却不知道该用在哪里,又能起到什么作用。唉,想想自己也算是写过不少CODE的人了,可这种眼高手低的毛病却从没改变过。今天突然想起extern这个关键字,遂决定不能再这么浪 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号