#define和inline的区别 sizeof与strlen的区别 以及运算符函数关键字三种概念

来源:互联网 发布:智能建筑网络通信系统 编辑:程序博客网 时间:2024/05/22 12:07

以下内容为百度所找,经整理后发表

define函数定义一个常量,定义以后无法更改,常量值只能是字符串或者数字

无参宏定义的一般形式为:#define 标识符 字符串/数字

#define:是宏定义的意思,宏定义在形式上类似于一个函数,定义预编译处理时的宏,只进行简单的字符替换,无类型检测,它的返回值也不能被强制转换为可以转换的类型,所以他的使用存在隐患和局限性

C中使用define这种形式宏定义的原因是因为可以提高C语言工作的效率

有关于宏定义的解释:

1. 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。

2.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。

3.宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。  

C++关键字,在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。

 

inline是一个关键字,用来定义内联函数

内联函数:在类中进行定义,对于类的一些补充:

typedef:用来定义类型别名,用于处理复杂类型

例如typedef int A; 则A a;//定义a为int

对于内联函数的一些补充:

内联函数对编译器提出建议,是否进行宏替换,编译器有权拒绝,也就是即为提出申请,不一定会成功

内联函数是代码被插入到调用者代码处的函数,通过避免被调用的开销来提高执行效率

对参数只进行一次精确求值,对参数进行检查,从而避免了宏错误,也就是调用内联函数和调用正规函数是等价的。

内联函数是以代码膨胀为代价的,不是所有函数都适用,要考虑实际情况。

C++中,在类的内部定义了函数体的函数就被默认为内联函数,不管是否有inline关键字
内联函数内不允许用循环语句,开关语句和递归调用等,且函数体不宜过长,否则作为普通函数处理

在调用一个内联函数之前,一定要在之前声明或定义为inline,否则当作普通函数处理

如果一个inline函数会在多个源文件中被用到,那么必须把它定义在头文件中

 

inline在C++中相对于define的优点:

C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。而inline取代了这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。

 

inline与#define的区别

1宏不是函数,而inline是函数

2内联函数会检查参数类型,语句是否正确等编译功能,宏定义不检查函数参数,所以内联函数更安

3宏在定义时要小心处理宏参数,一般情况是把参数用括弧括起来否则容易出现二义性,而内联函数不会出现二义性

4 内联函数在编译时展开,而宏在预编译时展开

5.在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。

6 inline可以不展开,宏一定要展开。因为inline指示对编译器来说,只是一个建议,编译器可以选择忽略该建议,不对该函数进行展开。

 

strlen和sizeof

sizeof():是一个判断数据类型或者表达式长度的运算符

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')
用到头文件string.h功能是计算给定字符串的长度

 

Sizeof与Strlen的区别与联系(转)

1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,还可以用函数做参数

strlen只能用char*做参数,且必须是以''\0''结尾的。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。  

上面是对静态数组处理的结果,如果是对指针,结果就不一样了

char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位
strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen

 

 

 

关键字

auto :声明自动变量

break:跳出当前循环

case:开关语句分支

char :声明字符型变量或函数返回值类型

const :声明只读变量

continue:结束当前循环,开始下一轮循环

default:开关语句中的“其它”分支

do :循环语句的循环体

double :声明双精度浮点型变量或函数返回值类型

else :条件语句否定分支(与 if 连用)

enum :声明枚举类型

extern:声明变量或函数是在其它文件或本文件的其他位置定义

float:声明浮点型变量或函数返回值类型

for:一种循环语句

goto:无条件跳转语句

if:条件语句

int: 声明整型变量或函数

long :声明长整型变量或函数返回值类型

register:声明寄存器变量

return :子程序返回语句(可以带参数,也可不带参数)

short :声明短整型变量或函数

signed:声明有符号类型变量或函数

阅读全文
0 0
原创粉丝点击