zoukankan      html  css  js  c++  java
  • #define 宏定义 与 typedef 类型定义

    一 #define 宏定义

    1. 宏基本定义 #define 宏名 宏定义字符串

    # 表示它在预编译处理中起作用,而不是真正的 C 语句,行尾无须跟分号,如果加了分号,分号作为宏定义的一部分。

    宏名常采用大写字母,宏名与定义字符串间用空格分隔,所以宏名之间不能有空格。

    宏定义字符串是宏名对应的具体实现过程,可以是任意字符串,中间可以有空格,以回车符作为结束。

    栗子:#define PI 3.1415926

    宏的用途:

    1)符号常量,如PI、数组大小定义,以增加程序的灵活性

    2)简单地函数功能实现,由于宏要在一行内完成,只能实现简单地函数功能 如 #define MAX(a, b) a > b ? a : b

    3)为程序书写带来一些方便。当程序中需要多长书写一些相同内容时,不放把它简写成宏

    如 #define LONG_STRING "It represent a long string that

    is used as an example"    表示该行为结束。

    宏定义可以写在程序中的任何位置,它的作用范围从定义触到文件尾,在次范围内都可以用宏名进行替换,并可以通过 #undef 强制指定宏的结束范围(在就需要结束的地方加上 #undef 宏名)。

    #define A "This is the first macro"
    
    printf("A");    //宏替换对引号内的宏名无效,输出 A
    printf(A);    //输出 This is the first marco

    2. 带参数的宏定义

    针对实现简单函数功能的宏定义,参数使用必不可少

    #define MAX(a, b)  a > b ? a: b

    宏引用形式与函数调用非常相似,但两者的实现过程完全不同。

    #include <stdio.h>
    #define MAX(a,b) a > b ? a: b
    #define SQR(x) x * x int main(void) { int x = 10, y = 30; x = MAX(x, y); printf("%d", x); }

    宏替换在程序编译预处理时完成,对于 MAX(x, y) 的编译预处理,首先用变量名 x, y 分别替换 a, b,然后再包含 x, y 的条件表达式替换 MAX(x, y). 编译结束后,程序中的 MAX(x, y)便消失。

    int max(int a, int b)
    {
        return a > b ? a : b;
    }

    函数调用时,如果实参是表达式,要先计算表达式,再把结果值传递过去。而宏替换不做计算,值直接传递过去.

    例如 求 y = ( x + y),如果写成 y = SQR( x + y), 宏替换后变成 y = x + y * x + y <> ( x + y)

    因为宏替换只是进行替换,要避免雷系问题,可以在宏定义中增加括号

    #define SQR(x) (x) * (x)

    二 typedef 类型定义

    用 typedef 定义类型: 用自定义名字为已有数据类型命名。当然了,在面向对象语言中,自定义类同样适用。

    typedef 类型 新的名字;       //注意分号不能少,一般要求重新定义的类型名用大写

    特点:

    1)typedef 没有创建新的数据类型,以我的理解是给了它一个别名

    2)typedef 定义类型不能定义变量

    3)typedef 与 define 是不同的

    之前自己对这两个关键字的作用也经常弄混,首先要捋清楚这两者这两者之间的区别,其实看名字就是能知义的。

  • 相关阅读:
    解决winfrom下TextBox不支持透明背景色
    C# Winform 怎么让按钮在Panel里居中显示
    DevExpress Cpicturebox或者Dev控件 PictureEdit 按比例的缩放加载图片
    Alluxio : 开源分布式内存文件系统
    yarn cluster和yarn client模式区别——yarn-cluster适用于生产环境,结果存HDFS;而yarn-client适用于交互和调试,也就是希望快速地看到application的输出
    Linux 反弹shell(二)反弹shell的本质
    浅谈摄像头有关的安全问题
    pyspark AttributeError: 'NoneType' object has no attribute 'setCallSite'
    大规模异常滥用检测:基于局部敏感哈希算法——来自Uber Engineering的实践
    pyspark minHash LSH 查找相似度
  • 原文地址:https://www.cnblogs.com/hyhl23/p/4161159.html
Copyright © 2011-2022 走看看