C语言难点总结

 

1,*与++结合

char str[20]="123456789";

char* p =str;

char c1 = *p++; //c1为字符 1

*p++解析:

*与++运算符 优先级同级,此优先级 结合方向 从右到左 。

所以先++,后*;后自增,先用一个副本取出p的值,再自增,

然后*作用到副本上,取出值为1。

*++p 编译是没有错误的

  1. +(加)与<<结合

1<<3是1向左移3位,结果是8,不是3向左移1位。

同样3>>1是3向右移1位,结果是1。

+的优先级高于<<,所以2+1<<3,先计算2+1结果是3,3向左移3,结果是24。而不是1向左移动3位,再加2。

3,指针变量,函数指针

int** p;int与*的结合性从右到左,所以,先是*p,说明p是一个指针,继续往左看,又一个*,说明指向的东西是指针,什么样的指针呢,int型的。OK~

int* a[5];[]的优先级高于int与*,说明a是一个数组,数组里东西是什么,指针,什么样的指针,int型的。OK~

int (*a)[5];首先a和*结合(由里到外),说明a是一个指针,什么样的指针呢,指向数组([]优先级高于int),什么样的数组,int型的。OK~

int* fun(double ); ()优先级高,所以fun是一个函数,参数double 型,返回指针,什么样的指针,int型的。OK~

int (*fun)(double);fun先于*结合,fun是一个指针,指向什么呢,右边()优先级高,说明指向函数,函数参数double型,返回int。OK~。

typedef int (*Fun)(double); Fun fun1;

4,extern与extern “C”

  1. extern修饰一个变量就代表这个变量是“外部”的,外部可理解为外部文件中的。比如a.cpp中定义一个全局int g_a;b.cpp中是无法访问此变量的,有编译错误如下:error C2065: a未声明的标识符。
  2. a.h中 有全局int g_a,b.cpp中#include “a.h”,再在b.cpp中extern int g_a;会报重定义的错误,但是你要知道,这里与b.cpp中的extern int g_a;并没有关系,而是a.h中存在一份int g_a;在#include之后,b.cpp中又有一份int g_a,自然会报 重定义编译错误。所以通常是在a.cpp中定义int g_a;
  3. 各种情况对应如下,应总结经验

(1)变量

main.cpp

a.cpp

编译情况

int a;

int a;

“int a”已经在main.cpp中定义

int a = 0;

int a;

“int a”已经在main.cpp中定义

int a;

int a = 0;

“int a”已经在main.cpp中定义

int a = 0;

int a= 0;

“int a”已经在main.cpp中定义

extern int a = 0;

int a= 0;

“int a”已经在main.cpp中定义

int a = 0;

extern int a= 0;

“int a”已经在main.cpp中定义

extern int a = 0;

extern int a= 0;

“int a”已经在main.cpp中定义

extern int a ;

extern int a;

无法解析的外部符号“int a”

extern int a =0;

extern int a;

不报错

extern int a ;

extern int a=0;

不报错

extern int a =0;

int a;

“int a”已经在main.cpp中定义

extern int a ;

int a;

不报错

extern int a ;

int a = 0;

不报错

int a ;

extern int a =0;

“int a”已经在main.cpp中定义

int a ;

extern int a ;

不报错

int a = 0;

extern int a;

不报错

 

  1. 函数 
    函数也有声明和定义,但由于函数的声明和定义是有区别的,函数的定义是有函数体的,所以函数的声明和定义都可以将extern省略掉,反正其他文件也是知道这个函数是在其他地方定义的。

1.c代码调用c++dll

 

编译c++dll的要点

供c调用的c++的函数接口不能包含c++特有的东西。

在编译生成供c代码调用的dll时,头文件的中的函数声明前要加上extern “C” 告诉编译器按照c规范处理函数名。

编译完成后,提供给c使用的头文件里面不能包含extern “C”,可以使用宏开关解决,也可以重新写个头文件。

c代码调用c++dll的要点

 

和正常调用c函数一样

2.c++调用c语言dll

 

编译c预言 dll的要点

 

c语言dll正常编写,不需要做额外处理

c++调用c语言dll的要点

 

在包含c的头文件或声明来自c的函数时需要加上extern "C", 建议这么做

  1. c调用c dll

这个直接生成dll,直接调用即可

  1. C++调用c++ dll

c++ dll为了让c调用,添加了extern “C”,c++调用的时候既可以添加external “C”,也可以不添加。好神奇。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值