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

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

       在c++ prime书中看到过,在DLL和lib中看到过,但是每次看过就不求甚解地一扫而过。心里知道有extern c这个语句,却不知道该用在哪里,又能起到什么作用。唉,想想自己也算是写过不少CODE的人了,可这种眼高手低的毛病却从没改变过。今天突然想起extern这个关键字,遂决定不能再这么浪费时间了。开动google,人肉了一把extern这小子,要说搜索引擎真是个好东西,什么都逃不过人家的眼睛。
      今天就在这里把extern这老小子给说明白了,也算有个白纸黑字吧。
      首先,你要搞明白,extern是C++的关键字。那么为什么C++会有这个关键字呢?
      各位看官应该知道,C++对相同函数名,但是不同函数参数的函数有重载这个功能吧,bingo! hey man, you got the key! 对了,C++编译器会在编译时把重载的函数的函数名修改为不同的函数名,这就是为啥C++能够进行重载的原因。举个例子吧。
       int a(char)
int a(int)
int a(double)...
       知道编译后,这些函数a会变成什么吗?我也不知道,应该不同的C++编译器有不同的实现方式,有可能会是这样的样子:a_char_xxx,a_in_xxx,a_double_xxx。这是原理,各位有疑问的,我也就只能解释到这个地步了,更进一步地理解,看官们可以参考侯捷大神翻译的《深入探究C++对象模型》,里面有更详细的陈述。 
       以上是存在extern这个关键字的原因。但是存在extern这个关键字的作用有哪些呢?
       很简单啦,"extern c"的作用就是告诉C++编译器不要再给我改变函数名了,我就要原样的函数名,谢谢。
       还是上面的例子:
       extern "c"
{
int a(char);
}
       这样,C++编译器就会尊敬地回答你,“好的,主人,听你的”。编译后的符号还是a,而不是a_char_xxx等等。
       那么这个时候,你可能会问,我知道了,可是这样做有什么用呢?就是不加extern,我还是能编译通过啊,我还是能正常执行啊。没错,这些你都能做到,但是,当这些函数被封装在一个库里呢?而


相关文档:

C Primer Plus里关于文件结尾判断的范例

当尝试从文件读入字符时,getc()函数会返回EOF,所以程序会在下一次读取时才会发现文件结尾。此时程序在试图读取空文件,可能会发生一些问题。所以应当在循环入口处进行判断。
int ch;
FILE * fp;
fp = fopen ("test","r");
while ((ch = getc(fp) != EOF)
{
putchar (ch);
} ......

C/C++ 中的移位操作拾遗

引言
最近笔者一直在做JPEG的解码工作,发现用完全使用哈夫曼树进行解码比较费时,而使用表结构存储编码和值的对应关系比较快捷,但是也存在比较难处理的地方,比如解码工作通常是以位为单位的操作,这里必然会涉及到移位操作,而笔者之前对位的操作很少,经验很欠缺,经过这次历练终于发现了一个自己曾经忽视的东西,那就 ......

linux 2.6.24在S3C2410上的移植(1)(基于GEC2410)

1.下载linux kernel源代码
到http://www.kernel.org/下载linux内核源代码,这里我们使用2.6.24.4的内核.
解压linux-2.6.24.4.tar.bz2
[matt@localhost GEC2410]$ tar -xvjf linux-2.6.24.4.tar.bz2
[matt@localhost GEC2410]$ cd linux-2.6.24.4
2.修改Makefile,设置交叉编译器
ARCH  ?= arm
CROSS_COMPILE ......

TCP(SOCKETS)编程 C/C++实现

通信
Server:
#pragma comment(lib, "ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>

void main()
{
//版本协商
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD(1,1); //0x0101
err = WSAStartup ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号