1,*与++结合
char str[20]="123456789";
char* p =str;
char c1 = *p++; //c1为字符 1
*p++解析:
*与++运算符 优先级同级,此优先级 结合方向 从右到左 。
所以先++,后*;后自增,先用一个副本取出p的值,再自增,
然后*作用到副本上,取出值为1。
*++p 编译是没有错误的
- +(加)与<<结合
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”
- extern修饰一个变量就代表这个变量是“外部”的,外部可理解为外部文件中的。比如a.cpp中定义一个全局int g_a;b.cpp中是无法访问此变量的,有编译错误如下:error C2065: a未声明的标识符。
- 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;
- 各种情况对应如下,应总结经验
(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; | 不报错 |
- 函数
函数也有声明和定义,但由于函数的声明和定义是有区别的,函数的定义是有函数体的,所以函数的声明和定义都可以将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", 建议这么做
- c调用c dll
这个直接生成dll,直接调用即可
- C++调用c++ dll
c++ dll为了让c调用,添加了extern “C”,c++调用的时候既可以添加external “C”,也可以不添加。好神奇。