您的位置:首页 > 编程语言 > C语言/C++

C++复习之二

2018-03-30 23:23 260 查看

共用体

共用体union,只能存储一种数据(在某个特定的时候),因此它的长度为最大成员的长度。当数据使用多种格式但不会同时使用时,可以节省空间。

指针

指针是一个变量,存储的是值的地址,而不是值本身,所以可以修改它的值。

指针+1增加量等于它它指向的类型的字节数。eg,double* ptr = &a; ptr = ptr + 1;

在数值上增加8。

如果数据类型本身不是指针,则可以将const 数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给const指针。

当且仅当只有一层间接关系(如指针指向基本数据类型时),才可以将非const地址或指针赋给const指针。

函数指针

函数也有地址,其地址是存储其机器语言代码的内存的开始地址。

function A(){}的函数地址就是函数名A

比如:

函数原型:double A(int b);

正确的指针类型声明如下:

double (*pf)(int);

(pf)是函数,pf是函数指针//注意,*pf一定要加括号,因为后面的括号优先级比高。

内联函数

编译器将使用相同的函数代码替换函数调用。

编译器不一定会满足程序员内联函数的需求,可能认为函数过大或者函数调用了自己(内联函数不能递归,也最好不要有循环和switch等结构)。

extern C关键字

在C++文件中引用C的头文件时,需要加extern “C”关键字

cpp文件

#include <iostream>
#include "cExample.h"
//没有加extern "C"

int main(int argc, char* argv[]) {
add(2, 3);
return 0;
}


结果出现了:



所以正确的做法应该是:

extern "C" {
#include "cExample.h"
}

int main(int argc, char* argv[]) {
add(2, 3);
return 0;
}


例如int add(int a, int b)函数经过C++编译器生成.o文件后,add会变成形如add_int_int之类的, 而C的话则会是形如_add, 就是说:相同的函数,在C和C++中,编译后生成的符号不同。

这就导致一个问题:如果C++中使用C语言实现的函数,在编译链接的时候,会出错,提示找不到对应的符号。此时extern “C”就起作用了:告诉链接器去寻找_add这类的C语言符号,而不是经过C++修饰的符号。

引用自hokein‘s github
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: