define与typedef、const、inline的区别

本文探讨了define、typedef、const和inline的区别。define是预处理器宏,无类型检查,作用域贯穿整个文件;typedef用于类型重命名,有作用域限制。const常量有类型检查并分配内存,而宏不检查类型且不占内存。inline函数虽类似宏,但有类型检查,更安全,且在编译时展开。define的#和##分别用于字符串化参数和拼接参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

define与typedef区别

  define是宏定义,typedef是重命名。

typedef int int_32;
typedef void(*Func)(int);  // Func为一个函数指针
#define PI 3.1415   // 宏定义没有;
#define max(x,y) ((x)>(y)?(x):(y)) 
作用域不同
  • typedef

(1)如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾;

(2)如果放在某个函数内,定义域就是从定义开始直到该函数结尾;

  • #define

(1)不管是在某个函数内,还是在所有函数之外,作用域都是从定义开始直到整个文件结尾。

(2)在同一编译单元内部,就算在不同的命名空间内,其作用范围不变。也就是从定义处一直到文件结束。

define与const的区别

(1)宏没有类型检查,只是字符的替换,而且可能由于边际效应在字符替换时产生意料不到的错误;const常量有严格的类型检查

(2)宏常量不开辟内存空间,const常量开辟内存空间

(3)有些集成化的调试工具可以对const常量进行调试,但不能对宏常量进行调试

(4)c++中const完全取代宏

#define ASPECT_RATIO 1.653    (#define宏后面没有分号;)

  记号名称ASPECT_RATIO也许从未被编译器看见,也许在编译器开始处理源码之前它就被预处理器移走了。于是ASPECT_RATIO可能没有进入记号表。于是当你运用此常量但获得一个编译错误时,这个错误信息会提到1.653而不是ASPECT_RATIO。如果ASPECT_RATIO被定义在一个非你所写的头文件内,则对1.653以及它来自何处毫无概念。

define和inline的区别

(1)内联函数同宏函数一样将在被调用处进行代码展开,省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高程序运行速度。但是内联函数在编译时展开,而宏是由预处理器对宏进行展开

(2)内联函数会检查参数类型,运行可调试,宏定义不检查函数参数 ,运行不可调试,所以内联函数更安全。

(3)宏不是函数,而inline函数是函数

(4)宏在定义时要小心处理宏参数,(一般情况是把参数用括弧括起来)。

(5)但是内联是以代码膨胀(复制)为代价,消耗内存。

(6)构造函数/析构函数可以是内联的,但是没必要

(7)自定义宏时要注意不要和预定义宏重名,否则未定义。

#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))

  写宏函数时,必须要为宏中所有实参加上小括号,但是即使加上下括号也会遇到不可思议的事情:

int a = 5, b = 0;
CALL_WITH_MAX(++a, b);    // a被累加二次
CALL_WITH_MAX(++a, b+10)  // a被累加一次
define #和##

  define语句中的#是把参数字符串化,##是连接两个参数成为一个整体。

#define STR(s)  #s  
#define CONS(a,b) (int)(a##e##b)     
int main() {    
    cout << (STR(vck)) << endl;    
    cout << CONS(2, 3) << endl;    
}  

CONS(2, 3)实际表示就是整型值2e3,也就是十进制数2000。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值