宏定义

宏定义

编译预处理指令

  • 开头的是便有意与处理指令

  • 他们不是C语言的成分,但是C语言程序离不开他们
  • define用来定义一个宏

#include<stdio.h>

#define PI 3.14159

int main(int argc, char const *argv[])
{
    printf("%f\n", 2*PI*3.0);
    
    return 0;
}
18.849540

#define

  • defin <名字> <值>

  • 注意没有结尾的分号,因为不是C的语句
  • 名字必须是一个单词,值可以是各种东西
  • 在C语言的编译器开始编译开始之前,编译预处理陈旭(cpp)会把程序中的名字换成值
    • 完全的文本替换

  • 如果一个宏的值中有其他宏的名字,也会被替换的
  • 如果一个宏的值超过一行,最后一行之前的行末需要加\
  • 宏的值后面出现的注释不会当做宏的值的一部分
#include<stdio.h>

#define PI 3.14159
#define FORMAT "%f\n"
#define PI2 2*PI

int main(int argc, char const *argv[])
{
    printf(FORMAT, PI2*3.0);

    return 0;
}
18.849540
#include<stdio.h>

#define PI 3.14159
#define FORMAT "%f\n"
#define PI2 2*PI
#define PRT printf("%f ",PI);\
            printf("%f\n",PI2)

int main(int argc, char const *argv[])
{
    //printf(FORMAT, PI2*3.0);
    PRT;

    return 0;
}
3.141590 6.283180

没有值的宏

  • define _DEBUG

  • 这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否已经被定义过了

预定义的宏

__LINE__   //行号
__FILE__   //文件名
__DATE__  //编译时候的日期 
__TIME__  //编译时候的时间
__STDC__


带参数的宏

像函数的宏

  • define cube(x) ((x) * (x) * (x))

  • 宏可以带参数
#include<stdio.h>

#define cube(x) ((x)*(x)*(x))

int main(int argc, char const *argv[])
{
    printf("%d\n", cube(5));
    
    return 0;
}
125

错误定义的宏

  • define RADTODEG(x) (x * 57.29578)

  • define RADTODEG(x) (x) * 57.29578

#include<stdio.h>

#define RADTODEG1(x) (x * 57.29578)
#define RADTODEG2(x) (x) * 57.29578
 int main(int argc, char const *argv[])
 {
     printf("%f\n", RADTODEG1(5+2));
     printf("%f\n", 180/RADTODEG2(1));
     return 0;
 }

119.591560
10313.240400

带参数的宏的原则

  • 一切都要括号

    • 整个值要括号
    • 参数出现的每个地方都要括号
  • define RADTODEG(x)((x)*57.29578)

待参数的宏

  • 可以带多个参数

    • define MIN(a,b)((a) > (b) ? (b):(a))

  • 也可以组合(嵌套)使用其他宏

  • 在大型程序的代码中使用非常普遍

  • 可以非常负载,如“产生”函数

    • 在#和##这两个运算符的帮助下
  • 存在中西方文化差异

  • 部分宏会被inline函数替代

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容