zoukankan      html  css  js  c++  java
  • c/c++ define用法

    define,无参宏定义的一般形式为:#define 标识符 字符串
    外文名
    define
    词条范围
    计算机专业用语
    无参一般形式
    #define 标识符 字符串
    带参一般形式
    #define 宏名(形参表) 字符串
     

    1参数编辑

    #define GPEBLT_FUNCNAME(basename) (SCODE (GPE::*)(struct GPEBltParms *))&GPE::##basename
    在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接前后两个参数,把它们变成一个字符串。
    1
    2
    3
    4
    5
    6
    7
    8
    #include<stdio.h>
    #define paster(n) printf("token"#n"=%d ",token##n)
    int main(vido)
    {
    int token9=10;
    paster(9);
    return 0;
    }
    输出为:token 9 = 10
    详见百科typedef(相似)。

    2作用编辑

    被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。
    宏定义的作用范围仅限于当前文件,即file1.c中定义 #define PI 3.14,在file2.c中该宏定义不起作用;通过将#define PI 3.14定义在common.h中,file1.c和file2.c分别#include "common.h"的方式,该宏定义在file1.c和file2.c中都起作用。
    在C或C++语言中,“宏”分为有参数和无参数两种。

    3宏定义优点编辑

    (1) 方便程序的修改
    使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时, 我们可以用较短的有意义的标识符来写程序,这样更方便一些。我们所说的常量改变不是在程序运行期间改变,而是在编程期间的修改,举一个大家比较熟悉的例 子,圆周率π是在数学上常用的一个值,有时我们会用3.14来表示,有时也会用3.1415926等,这要看计算所需要的精度,如果我们编制的一个程序中 要多次使用它,那么需要确定一个数值,在本次运行中不改变,但也许后来发现程序所表现的精度有变化,需要改变它的值, 这就需要修改程序中所有的相关数值,这会给我们带来一定的不便,但如果使用宏定义,使用一个标识符来代替,则在修改时只修改宏定义即可,还可以减少输入 3.1415926这样长的数值多次的情况,我们可以如此定义 #define pi 3.1415926,既减少了输入又便于修改,何乐而不为呢?
    (2) 提高程序的运行效率
    使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,提高运行效率。正如C语言中所讲,函数的使用可以使程序更加模块化,便于组织,而且可重复利用,但在发生函数调用时,需要保留调用函数的现场,以便子函数执行结束后能返回继续执行,同样在子函数执行完后要恢复调用函数的现场,这都需要一定的时间,如果子函数执行的操作比较多,这种转换时间开销可以忽略,但如果子函数完成的功能比较少,甚至于只完成一点操作,如一个乘法语句的操作,则这部分转换开销就相对较大了,但使用带参数的宏定义就不会出现这个问 题,因为它是在预处理阶段即进行了宏展开,在执行时不需要转换,即在当地执行。宏定义可完成简单的操作,但复杂的操作还是要由函数调用来完成,而且宏定义所占用的目标代码空间相对较大。所以在使用时要依据具体情况来决定是否使用宏定义。

    4无参宏定义编辑

    无参宏定义的一般形式为:#define 标识符 字符串
    其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。
    例如: #define M (a+b) 它的作用是指定标识符M来代替表达式(a+b)。在编写源程序时,所有的(a+b)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(a+b)表达式去置换所有的宏名M,然后再进行编译。
    程序1:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include<stdio.h>
    #define M (a+b)
    int main(vido)
    {
    int s,a,b;
    printf("inputnumbera&b:");
    scanf("%d%d",&a,&b);
    s = M*M;
    printf("s=%d ",s);
    }
    上例程序中首先进行宏定义,定义M来替代表达式(a+b),在 s= M * M 中作了宏调用。在预处理时经宏展开后该语句变为: S=(a+b)*(a+b)  但要注意的是,在宏定义中表达式(a+b)两边的括号不能少。否则会发生错误。  如当作以下定义后:#define M (a)+(b)  在宏展开时将得到下述语句:S= (a)+(b)*(a)+(b)
    对于宏定义还要说明以下几点:
    1.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。
    2.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
    3.宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。  (有关#undef 请查阅其他资料)

    5带参宏定义编辑

    c语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参
    带参宏定义的一般形式为:  #define 宏名(形参表) 字符串
    在字符串中含有各个形参。 带参宏调用的一般形式为:  宏名(形参表)
    例如:
    1
    2
    #defineM(y)((y)*(y)+3*(y))/*宏定义*/
    k=M(5);/*宏调用*/
    在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为:  k=5*5+3*5
    程序2:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //#include<cstdio>
    #include<stdio.h>
    #define MAX(a,b)((a>b)?(a):(b))
    intmain(intargc,char*argv[])
    {
    intx,y,max;
    printf("inputtwonumbers:");
    scanf("%d%d",&x,&y);
    max=MAX(x,y);
    printf("max=%d ",max);
    return0;
    }
    上例程序的第一行进行带参宏定义,用宏名MAX表示条件表达式 (a>b)?a:b ,形参a,b均出现在条件表达式中。程序中 max=MAX(x,y) 为宏调用,实参x,y,将代换形参a,b。宏展开后该语句为: max=(x>y)?x:y;  用于计算x,y中的大数。
    #define 条件编译
    头文件(.h)可以被头文件或C文件包含;重复包含(重复定义)由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。 通过条件编译开关来避免重复包含(重复定义)
    例如
    1
    2
    3
    4
    #ifndef__headerfileXXX__
    #define__headerfileXXX__
    //文件内容
    #endif
    详见百科#typedef(相似)

    6PHP用法编辑

    define() 函数定义一个常量。
    常量类似变量,不同之处在于:
    在设定以后,常量的值无法更改
    常量名不需要开头的美元符号 ($)
    作用域不影响对常量的访问
    常量值只能是字符串或数字

    7例子编辑

    例子 1

    定义一个大小写敏感的常量:
    1
    <?phpdefine("GREETING","Helloworld!");echoconstant("GREETING");?>
    输出:
    Hello world!

    例子 2

    定义一个大小写不敏感的常量
    1
    <?phpdefine("GREETING","Helloworld!",TRUE);echoconstant("greeting");?>
    输出:
    Hello world!
  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/lidabo/p/4560698.html
Copyright © 2011-2022 走看看