zoukankan      html  css  js  c++  java
  • #define const typedef

    #define用法

    1. 定义简单的常数:定义常量,便于修改

    #define N 1000

    2. 定义简单的函数:注意多使用括号

    define可以像函数那样接受一些参数,如下:

    #define max(x,y) (x)>(y)?(x):(y)

    这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。但是这样做的话存在隐患,例子如下:

    #define Add(a,b) a+b;

    在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了

    c*a + b*d

    const常量与define宏定义的区别

    编译器处理方式不同:

    define宏是在预处理阶段展开。const常量是编译运行阶段使用。

    类型和安全检查不同:

    define宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查。

    存储方式不同:

    define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

    const常量会在内存中分配(可以是堆中也可以是栈中)。

    C++的const比C语言#define更好的原因?

    首先,它能够明确指定类型,有类型检查功能。

    其次,可以使用C++的作用域规则将定义限制在特定的函数或文件中。

    第三,可以将const用于更复杂的类型,比如数组和结构。

    C语言中也有const,其与C++中const的区别是:一是作用域规则不同;另一个是,在C++中可以用const值来声明数组长度。C编译器不能把const看成一个编译期间的常量,即C编译器不知道它在编译时的值。

    ===========================================================

    对宏定义的使用要非常小心,特别要注意两个问题:

    (1)谨慎地将宏定义中的“参数”和整个宏用括弧括起来。如定义最小宏:#define MIN(A,B) ( (A) <= (B) ? (A) : (B) ) ,所以,严格地讲,下述解答:

    #define MIN(A,B) (A) <= (B) ? (A) : (B) ////// #define MIN(A,B) (A <= B ? A : B ) 都应判0分;

    (2)防止宏的副作用。对MIN(*p++, b)的作用结果是:((*p++) <= (b) ? (*p++) : (*p++)) ,这个表达式会产生副作用,指针p会作三次++自增操作。

    typedef用法

    简化复杂的类型声明

    简化复杂的类型声明,或给已有类型起一含义明确的别名;如:

    typedef bool (*FuncPointer)(int, double); //声明了一个返回 bool 类型并带有两个(int和double)形参的函数的指针类型FuncPointer

    FuncPointer pFunc; //声明了一个FuncPointer类型的函数指针对象pFunc

    定义与平台无关的类型

    定义与平台无关的类型,屏蔽不同平台的类型差异化;如:

    用typedef来定义与平台无关的类型。

    比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:

    typedef long double REAL;

    在不支持 long double 的平台二上,改为:

    typedef double REAL;

    在连 double 都不支持的平台三上,改为:

    typedef float REAL;

    也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。

    标准库就广泛使用了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。

    与struct的结合使用

    在C++中,struct与class的作用相同,就是默认的访问权限不同,struct默认为public,而class默认为private的。

    但是在C语言中,struct的定义和声明要用typedef。如果没有typedef就必须用struct Person person;来声明

    typedef与#define的区别

    执行时间不同

    关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。

    #define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。

    功能有差异

    typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等。

    #define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

    作用域不同

    #define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。

    而typedef有自己的作用域。

    参考:http://blog.csdn.net/luoweifu/article/details/41630195

  • 相关阅读:
    [置顶] android ListView包含Checkbox滑动时状态改变
    Xamarin Android Gestures详解
    尝试在条件“$(_DeviceSdkVersion) >= 21”中对计算结果为“”而不是数字的“$(_DeviceSdkVersion)
    Xamarin Android自定义文本框
    C#四种深拷贝方法(转载)
    设置pictureBox的边框颜色(转载)
    C# 在运行中拖拽,改变控件大小位置类(转载)
    Ocelot + Consul的demo(二)集群部署
    Objective-C 简介
    计算机网络—概述
  • 原文地址:https://www.cnblogs.com/raichen/p/5837377.html
Copyright © 2011-2022 走看看