C语言 预处理二(宏定义--#define)

//#define 宏定义(宏定义一般大写)
//知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件

#include<stdio.h>
#include<stdlib.h>
//知识点二-->宏定义作用
//宏定义作用1:起到替换作用,可以定义常量
#define X 10

//宏定义作用2:替换代码的任意部分(一般用于易语言,或者加密代码)
#define 水乃万物之源 main

//注意:宏定义不是普通C 语句,在行末不必加分号,如加上分号则连分号也一起置换
#define Y 100;

//知识点三-->带参数的宏定义(可以部分替代函数调用)
//①带参数的宏仅仅是替换,不求出实际参数的值,函数调用时,会计算参数的值
//②函数调用时会给参数分配内存,宏仅仅是替换,不占用内存
//③函数有返回值的概念,宏没有返回值的概念,返回的是一个表达式,表达式的结果等价于函数的返回值
//④函数调用时是有类型的,宏替换不需要类型
//⑤宏替换展开时代码变长,函数调用不会

//函数调用时跳转,返回耗费时间,占用资源

//多个函数调用会让程序运行时间增加,不影响预处理时间
//多个宏调用,会让预处理时间增加,运行时间会短

#define FL(x) x*x 

//求两个数的最小数
#define MYMIN(x,y) x>y?y:x

#define MYTEX(x,y) x*y
#define MYTEX2(x,y) (x)*(y)

//#define MYTEX2((x),(y)) (x)*(y) 这样的宏定义是错误的,带参数的宏的参数上不可以有()

//知识点四-->宏定义语句中#的作用是将参数变成字符串
#define MYTEF(x) printf("%s\n",#x)
#define MYTEF2(x) printf("%s---%d\n",#x,x)

//知识点五-->在C语言的宏中,"##"被称为  连接符
//它是一种预处理运算符,用来把两个语言符号组成单个语言符号
//这里的语言符号不一定是宏的变量,"##"运算符可以将两个记号(例如标识符)“粘”在一起,成为一个记号

//例子:
#define L(x) S##x //例如L(1)就等价于S1
#define L1(x) 人##x //例如L(1)就等价于人1

#define PN(x) Etes##x //例如L(1)就等价于人1

//注意:"##"运算符不能作为第一个或者最后一个元素存在
//#define PN2(x) ##x    报错
//#define PN2(x) x##   报错(直接执行并没有错,应该##会把“报错”两个字当成一个符号)

//如果带参数的宏定义比较长,可以使用‘\‘连接
#define MYTRE(x) if(x>1){\
    printf("这个数值是大于1的啊\n");}else{    printf("这个数值其实也并不是很大嘛\n"); }

void go1(){
    //注意:#define 不受块语句限制
    #define Z 10.0
    //下面的main函数中仍然可以使用Z
}

void Etes1(){
    printf("我是函数Etes1\n");
}
void Etes2(){
    printf("我是函数Etes1\n");
}

void 水乃万物之源(){
    int a[X] = { 0 };
    //X = 5;  报错: 错误    1    error C2106 : “ = ” : 左操作数必须为左值    ,说明X是个常量

    //printf("%d", Y);报错:错误    2    error C2059: 语法错误:“)”
    //因为这里Y是100;

    printf("%d\n", X); 

    printf("%d\n", Z);//打印0,因为这里Z是double类型的
    //注意:宏展开只是种简单的代换,字符串中可以包含任何字符,
    //可以是常数,也可以是表达式,预处理器进行宏展开时并不进行语法检查。

    #undef X//结束X的宏定义
    //printf("%d\n", X);  报错

    //带参数的宏定义
    printf("%d\n", FL(3));

    printf("%d\n", MYMIN(3,8));//打印3

    printf("%d\n", MYTEX(1+7, 2+7));//打印22
    //注意:define只会替换,所以 MYTEX(1+7, 2+7))等价于1+7*2+7
    printf("%d\n", MYTEX2(1 + 7, 2 + 7));//打印72

    //宏定义中#的应用
    MYTEF(你好);//打印“你好”
    //宏定义中#还应用于打印变量的名字
    int a1 = 9;
    MYTEF2(a1);

    MYTRE(2)

        //"##"运算符的使用
        int L(1), L1(1);
    //这里的L(1)就是S1
    S1 = 10;
    人1 = 3;
    printf("L(1)的值是%d\n",L(1));
    MYTEF2(L1(1));
    //"##"运算符用于调用各种函数
    PN(1)();
    //PN(1)相当于Etes1

    system("pause");
}
时间: 2024-08-07 04:33:07

C语言 预处理二(宏定义--#define)的相关文章

C语言宏定义#define用法

#define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利.1 #define命令剖析1.1   #define的概念#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本.

黑马程序员------C 语言学习笔记---C语言中的宏定义

1.5    C语言程序的运行过程 01 源程序:由高级语言或汇编语言编写,C语言源程序的扩展名为.C 02 目标程序:源程序经“编译程序”翻译所得的二进制代码为目标程序,其扩展名为.obj 03 可执行程序:目标程序与库函数连接,形成可执行程序,.out #include <stdio.h> int main() { #define PI 3.14 double r,len,area; printf("请输入半径:\n"); // 提示用户输入半径 scanf("

预处理指令--宏定义

预处理指令简介 •C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 •为了区分预处理指令和一般的C语句,所有预处理指令都以符号“#”开头,并且结尾不用分号 •预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾.习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件 •C语言提供的预处理指令主要有:宏定义.文件包含.条

&lt;转&gt;Verilog HDL宏定义define

宏定义 `define 用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: `define 标识符(宏名) 字符串(宏内容) 如:`define signal string 它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把程序中在该命令以后所有的signal都替换成string.这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串

宏定义 #define 和常量 const 的区别

宏定义 #define 和常量 const 的区别 类型和安全检查不同 宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误: const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查 编译器处理不同 宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期: const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据 存储方式不同 宏定义是直接替换,不会分配内存,存储与

C语言学习笔记--C语言中的宏定义

1. C 语言中的宏定义 (1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)(3)#define 定义之后的代码都可以使用这个宏 2. 定义宏常量 (1)#define 定义的宏常量可以直接使用(2)#define 定义的宏常量本质为字面量 3. 宏定义表达式 (1)#define 表达式的使用类似函数调用(2)#define 表达式可以比函数更强大(3)#define 表达式比函数

iOS之宏定义#define

最基本的宏定义用法 #define aaa  bbb 表示用aaa替换bbb的内容. 宏作用范围 宏的作用范围是在当前文件内, 如果需要作用于其他类(如在类b调用类a已定义宏),那么需要在类b引入类a的头文件(a.h). 如果需要作用于整个工程,可以定义一个类如Config.h,在该类定义好需要的宏,然后在工程的XXX_Prefix.pch文件 #import "Config.h" 在Config.h中 #define aaa  bbb 在XXX_Prefix.pch文件 中 #ifd

[转]c语言宏定义#define的理解与资料整理

原文地址:http://www.cnblogs.com/haore147/p/3646934.html 1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认识这个宏了:也可以把任何东西定义成宏.因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙. 看例子: 1 #define PI 3.141592654 在此后的代码

《黑马程序员》预处理指令(宏定义、条件编译、文件包含)(C语言)

宏定义的基本概念 ●  预处理指令都是以#开头 ●  预处理指令分为三种 1.宏定义 定义格式:#define  宏名   参数 2.条件编译 #if 条件语句     statement1; #elif 条件语句     statement2; #else     statement3; #endif       //条件编译结束必须加上此条语句,否则statement3以下的所有语句都将默认为不编译 3.文件包含 ●  预处理指令在代码翻译成0和1之前进行 ●  预处理指令的位置是可以写的