define_defineproperty - CSDN
define 订阅
define,宏定义,C语言中预处理命令一种。分为无参宏定义和带参宏定义。无参宏定义的一般形式为:#define 宏名 字符串;带参宏定义的一般形式为:#define 宏名(参数表) 字符串;PHP中define 函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量名不需要开头的美元符号 ($)。作用域不影响对常量的访问 。常量值只能是字符串或数字。 展开全文
define,宏定义,C语言中预处理命令一种。分为无参宏定义和带参宏定义。无参宏定义的一般形式为:#define 宏名 字符串;带参宏定义的一般形式为:#define 宏名(参数表) 字符串;PHP中define 函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量名不需要开头的美元符号 ($)。作用域不影响对常量的访问 。常量值只能是字符串或数字。
信息
条件编译
#ifdef、#ifndef、#undef
外文名
define
带参一般形式
#define 宏名(参数表) 字符串
中文名
宏定义
无参一般形式
#define 宏名 字符串
词条范围
计算机专业用语
define概念
#define 命令是 C 语言中的一个宏定义命令 ,它用来将一个标识符定义为一个字符串 , 该标识符被称为宏名, 被定义的字符串称为替换文本。 [1]  该命令有两种格式:一种是简单的宏定义, 另一种是带参数的宏定义。
收起全文
精华内容
参与话题
  • C++中 #define的用法

    万次阅读 2018-08-24 14:45:56
    C++中 #define的用法   转自:http://www.dingge.com/main/article.asp?id=10 今天整理了一些#define的用法,与大家共享!1.简单的define定义 #define MAXTIME 1000 一个简单的M...

    C++中 #define的用法
     

    转自:http://www.dingge.com/main/article.asp?id=10

    今天整理了一些#define的用法,与大家共享!
    1.简单的define定义

    #define MAXTIME 1000

    一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

    if(i<MAXTIME){………}

    编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

    这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

    2.define的“函数定义”

    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

    另外举一个例子:
    #define pin (int*);
    pin a,b;
    本意是a和b都是int型指针,但是实际上变成int* a,b;
    a是int型指针,而b是int型变量。
    这是应该使用typedef来代替define,这样a和b就都是int型指针了。

    所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。

    3.宏的单行定义
    #define A(x) T_##x
    #define B(x) #@x

    #define C(x) #x
    我们假设:x=1,则有:
    A(1)——〉T_1
    B(1)——〉’1’
    C(1)——〉”1”

    (这里参考了 hustli的文章)

    4.define的多行定义

    define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

    #define MACRO(arg1, arg2) do { /
    /* declarations */ /
    stmt1; /
    stmt2; /
    /* … */ /
    } while(0) /* (no trailing ; ) */
    关键是要在每一个换行的时候加上一个”/”

    摘抄自http://www.blog.edu.cn/user1/16293/archives/2005/115370.shtml 修补了几个bug

    5.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

    就是:
    #ifdef WINDOWS
    ……
    ……
    #endif
    #ifdef LINUX
    ……
    ……
    #endif

    可以在编译的时候通过#define设置编译环境

    6.如何定义宏、取消宏

    //定义宏
    #define [MacroName] [MacroValue]
    //取消宏
    #undef [MacroName]
    普通宏
    #define PI (3.1415926)

    带参数的宏
    #define max(a,b) ((a)>(b)? (a),(b))
    关键是十分容易产生错误,包括机器和人理解上的差异等等。

    7.条件编译
    #ifdef XXX…(#else) …#endif
    例如 #ifdef DV22_AUX_INPUT
    #define AUX_MODE 3
    #else
    #define AUY_MODE 3
    #endif
    #ifndef XXX … (#else) … #endif

    8.头文件(.h)可以被头文件或C文件包含;
    重复包含(重复定义)
    由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。
    通过条件编译开关来避免重复包含(重复定义)
    例如
    #ifndef __headerfileXXX__
    #define __headerfileXXX__

    文件内容

    #endif
     
     
     

                </div>
    
    展开全文
  • C语言中#define用法总结

    万次阅读 多人点赞 2018-04-09 16:49:52
    1.简单的宏定义#define 标识符 替换列表(替换列表可以是数,字符串字面量,标点符号,运算符,标识符,关键字,字符常量。注意:替换列表是可以为空的)典型错误:#define N = 100int a[N]; /*这样会成为int a[= ...
    1.简单的宏定义
    #define 标识符 替换列表(替换列表可以是数,字符串字面量,标点符号,运算符,标识符,关键字,字符常量。注意:替换列表是可以为空的)
    典型错误:
    #define N = 100
    int a[N]; /*这样会成为int a[= 100],这里会处理成为一种标识记号一样*/
     
     
    #define N 100;
    int a[N]; /*带分号的定义会成为int a[100;],这是一种很常见的错误*/
     
    #define pin (int*);
    pin a,b;
    int* a,b; /*本意是a和b都是int型指针,但是实际上变成int* a,b;a是int型指针,而b是int型变量。这是应该使用typedef来代替define,这样a和b就都是int型指针了。*/
     
     
    典型的使用方法:
    使用宏定义我们可以自己根据自己的习惯来定义甚至改变C语言的语法习惯,例如:
    #define BEGIN {
    #define END }
    int main()BEGIN
    printf ("DEFINE----\n");
    END
     
    定义一个循环
    #define LOOP for(;;)
     
    重新定义数据类型
    #define IT int
     
     
    2.带参数的宏
    #define 标识符(x1,x2,x3...xn) 替换列表  (注意:x1,x2,x3..是宏的参数,标识符和其左括弧之间不能有空格)
    使用方法:
    #define MAX(x,y) ((x)>(y)?(x):(y))
    i=MAX(j+k,m-n);
    替换为:
    i=MAX((j+k)>(m-n)?(j+k):(m-n));
    #define SI_EX(n) ((n)%2==0)
    if(SI_EX(i)) i++;
    替换为:
    if(SI_EX((i)%2==0))
    通过以上例子我们可以看出,标识符带参数(X1,X2,X3.....)在替换时会被替换列表(Y1,Y2,Y3....)对应的替换,但是和顺序无关。
     
     
    3.宏的特殊单行定义
    #define A(x) T_##x
    #define B(x) #@x
    #define C(x) #x
    x=1
    替换为:
    A(1)------> T_1 (T_##x,##符号是记号粘黏符号,将前后的字符粘黏起来。)
    B(1)------> '1' ( #@x , #@ 符号会将宏的参数进行字符串字面量化,并且加‘’号)
    C(1)------> "1" ( #x ,#符号会将宏的参数进行字符串字面量化,并且加""号)
     
     
    4.define的多行定义
    define可以替代多行的代码,在每一个换行的时候加上一个"\"
    #define MAX(X,Y) do { \
    语句1; \
    语句2; \
    /* 注释的写法 */ \
    } while(0) /* (no trailing ; ) */ \
     
     
    5.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。
    #ifdef WINDOWS
    ......
    ......
    #endif
    #ifdef LINUX
    ......
    ......
    #endif
    可以在编译的时候通过#define设置编译环境
    6.取消宏
    #undef 标识符
     
     
    7.条件编译
    #ifdef XXX…(#else) … #endif
     
     
    8.预定义宏
    在C语言中收录了一些有用的宏,这些宏是提供当前编译信息的。
    __LINE__        被编译文件的行数
    (整型)
    __FILE__  被编译文件的名字 (字符型)
    __DATE__  编译日期 (字符型)
    __TIME__  编译时间 (字符型)
    __STDC__  如果编译器接受标准C,那么值为1. (整型)
     
     
    通常我们在编译的时候我们可以用这些预定义的宏来进行排错,例如:
    一般情况下,当出现除零的情况时编译器是没有提示的,我们可以自定义一个解决办法。
    #define CHECKZERO(divisor)\
    if(divisor==0)\
    printf("***ATTEMPT TO DIVIDE BY ZERO IN LINE %d of file %s ***\n",__LINE__,__FILE__);\
     
     
    引用方法
    CHECKZERO(j);
    k=i/j;
    展开全文
  • C语言中define的用法

    2020-07-28 23:32:56
    define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便。 预处理命令以“#”号开头,如包含命令#include,宏定义命令#define等。一般都放在源文件的前面,它们称为预处理部分。 ...
  • #define的常见用法

    万次阅读 多人点赞 2018-07-13 21:09:25
    先来讲一讲#define的优点与缺点: [优点] 当在程序中想要修改某一个值得时候,而且这个值又在很多地方引用。这时候就能体现出宏定义的强大优点了。 例如:#define LINK LED0 //定义LINK的灯为LED01因为在程序中...

    先来讲一讲#define的优点与缺点: 
    [优点] 
    当在程序中想要修改某一个值得时候,而且这个值又在很多地方引用。这时候就能体现出宏定义的强大优点了。 
    例如:

    #define LINK LED0   //定义LINK的灯为LED0

    因为在程序中我们可能很多地方要对LINK灯进行操作,当我们想换LINK灯的时候,直接将:

    #define LINK LED1

    这样就很方便了,不用一处处去找,而且不用担心有漏掉的可能。 
    [缺点] 
    宏定义有一些缺点: 
    (1) 无法对宏定义中的变量进行类型检查 
    此缺点,是相对于const变量来说的 
    [define与const的区别的简单总结]

    define定义的变量,是Compile-Time时期的变量,系统在编译时候,就将其全部替换,而不会对其变量进行类型等属性检查,相对不是很安全,可能存在潜在的问题,而没有发现. 
    正因为其仅仅是编译时期替换,所以其定义的变量,是不会在运行时候分配内存的,不占用内存空间. 
    const定义的变量,是 Run-Time时期的变量,如果类型不匹配,系统在运行时候,就会发现并提示或报错,对应的,const变量在运行时期,也是一种变量,系统会为其分配内存. 
    (2) 边界效应 
    A. 未加括号带来的边界效应 
    由于宏定义的时候,其各个分量未加括号,而在使用宏定义的时候,传递的参数是变量的表达式,然后经过系统展开后,由于优先级的原因,导致其结果不是你所希望的. 
    [例子]

    #define MUL(A,B) A*B

    而在使用的时候,这样的调用: 
    int a=1,b=2,c=3,d=0; 
    d=MUL(a+b,c) 
    经过编译时候展开,就变成了 
    d=a+b*c 
    而不是我们所希望的 
    d=(a+b)*c 
    [解决办法] 
    其解决办法也很简单,就是给每个分量,都加上括号,就可以避免此类问题 
    即,在宏定义的时候,如此定义:

    #define MUL(A,B) ((A)*(B))
    1. define的变体,即#ifndef,可以防止头头文件的重复引用 
      [释] 
      #ifdef和 #define组合,一般用于头文件中,用以实现防止多个文件对此同一个头文件的重复引用.实际使用中,即使你的头文件暂时没有被多个文件所引用,为了增加程序可读性,移植性,健壮性等,还是最好都加上。其用法一般为:
    #ifndef <标识>
    #define <标识>
    ………   // include or define sth.
    #endif

    <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的;标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线, 
    如:stdio.h对应的就是:

    #ifndef _STDIO_H_
    #define _STDIO_H_
    ………   // include or define sth.
    #endif

    举个例子

    #ifndef CHARDEV_H
    #define CHARDEV_H
    
    #include
    
    
    #define MAJOR_NUM 100

    #endif

    例子中的chardev.h中,就用到了

    #ifndef CHARDEV_H
    #define CHARDEV_H#endif

    这样做之后,以后某个文件引用此头文件,就包含了chardev.h文件,而其他文件如果再引用此头文件的话,编译器那么就会判断出来,已经define了CHARDEV_H,已经有其他文件引用了此文件,so,the complier will not include this header file. 就可以发现解决重复引用头文件的问题了.

    2. #define的变体,即#ifdef,可以实现加入自己需要的模块(源文件) 
    [例子] 
    在源文件中加入

    #ifdef MYSELF_H
    #include "myself.c"
    #endif

    可以实现在源文件中加入myself.c的代码,将其实现的功能加进来, 即加入了myself模块 
    3. 简单的define定义

    #define MAXTIME 1000

    一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

    if(i<MAXTIME){.........}

    编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

    这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。 
    4. define的“函数定义” 
    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

    另外举一个例子:

    #define pin (int*);
    pin a,b;

    本意是a和b都是int型指针,但是实际上变成int* a,b; 
    a是int型指针,而b是int型变量。 
    这是应该使用typedef来代替define,这样a和b就都是int型指针了。 
    即:

    typedef pin (int *)
    
    pin a,b;

    此时:a和b都是 int*型的。 
    所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。 
    5. 宏的单行定义

    #define A(x) T_##x
    #define B(x) #@x
    #define C(x) #x

    我们假设:x=1,则有:

    A(1)------〉T_1
    B(1)------〉'1'
    C(1)------〉"1"

    6. define的多行定义

    define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

    #define MACRO(arg1, arg2) do { /
    /* declarations */ /
    stmt1; /
    stmt2; /
    /* ... */ /
    } while(0) /* (no trailing ; ) */

    关键是要在每一个换行的时候加上一个”/”

    7 .在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

    即:

    #ifdef WINDOWS
    ......
    ......
    #endif
    #ifdef LINUX
    ......
    ......
    #endif

    可以在编译的时候通过#define设置编译环境

    8. 如何定义宏、取消宏

    //定义宏
    #define [MacroName] [MacroValue]
    //取消宏
    #undef [MacroName]
    //普通宏
    #define PI (3.1415926)
    
    带参数的宏
    #define max(a,b) ((a)>(b)? (a),(b))

    关键是十分容易产生错误,包括机器和人理解上的差异等等。

    9. 条件编译

    #ifdef XXX…(#else) … #endif
    例如
    #ifdef DV22_AUX_INPUT
    #define AUX_MODE 3 
    #else
    #define AUY_MODE 3
    #endif
    #ifndef XXX … (#else) … #endif

    展开全文
  • #define用法集锦(非常全)

    万次阅读 多人点赞 2018-06-19 05:56:19
    Definition:The #define Directive You can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are: Syntax #define identifier token-string...

    Definition:

    The #define Directive

      You can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are:

      Syntax

      #define identifier token-stringopt

      #define identifier[( identifieropt, ... , identifieropt )] token-stringopt

     

    Usage:

     

    1.       简单的define定义

    #define MAXTIME 1000

    一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

    if(i<MAXTIME){.........}

    编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

    这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

    2.define的“函数定义”

    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

    另外举一个例子:

    #define pin (int*);

    pin a,b;

    本意是a和b都是int型指针,但是实际上变成int* a,b;

    a是int型指针,而b是int型变量。

    这是应该使用typedef来代替define,这样a和b就都是int型指针了。

    所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。

    3.宏的单行定义(少见用法)

    #define A(x) T_##x

    #define B(x) #@x

    #define C(x) #x

    我们假设:x=1,则有:

    A(1)------〉T_1

    B(1)------〉'1'

    C(1)------〉"1"

    (这里参考了 hustli的文章)

    3.define的多行定义

    define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

    #define MACRO(arg1, arg2) do { /

    /* declarations */ /

    stmt1; /

    stmt2; /

    /* ... */ /

    } while(0) /* (no trailing ; ) */

    关键是要在每一个换行的时候加上一个"/"

    4.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

    就是:

    #ifdef WINDOWS

    ......

    ......

    #endif

    #ifdef LINUX

    ......

    ......

    #endif

    可以在编译的时候通过#define设置编译环境

    5.如何定义宏、取消宏

    //定义宏

    #define [MacroName] [MacroValue]

    //取消宏

    #undef [MacroName]

    //普通宏

    #define PI (3.1415926)

    带参数的宏

    #define max(a,b) ((a)>(b)? (a),(b))

    关键是十分容易产生错误,包括机器和人理解上的差异等等。

    6.条件编译

    #ifdef XXX…(#else) … #endif

    例如

    #ifdef DV22_AUX_INPUT

    #define AUX_MODE 3

    #else

    #define AUY_MODE 3

    #endif

    #ifndef XXX … (#else) … #endif

    7.头文件(.h)可以被头文件或C文件包含;

    重复包含(重复定义)

    由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。

    通过条件编译开关来避免重复包含(重复定义)

    例如

    #ifndef __headerfileXXX__

    #define __headerfileXXX__

    //文件内容

    #endif

     

     

     Instances:

     

    1、防止一个头文件被重复包含

    #ifndef COMDEF_H

    #define COMDEF_H

     //头文件内容

    #endif

    2、重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。

    typedef  unsigned char      boolean;     /* Boolean value type. */

    typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */

    typedef  unsigned short     uint16;      /* Unsigned 16 bit value */

    typedef  unsigned char      uint8;       /* Unsigned 8  bit value */

    typedef  signed long int    int32;       /* Signed 32 bit value */

    typedef  signed short       int16;       /* Signed 16 bit value */

    typedef  signed char        int8;        /* Signed 8  bit value */

    //下面的不建议使用

    typedef  unsigned char     byte;         /* Unsigned 8  bit value type. */

    typedef  unsigned short    word;         /* Unsinged 16 bit value type. */

    typedef  unsigned long     dword;        /* Unsigned 32 bit value type. */

    typedef  unsigned char     uint1;        /* Unsigned 8  bit value type. */

    typedef  unsigned short    uint2;        /* Unsigned 16 bit value type. */

    typedef  unsigned long     uint4;        /* Unsigned 32 bit value type. */

    typedef  signed char       int1;         /* Signed 8  bit value type. */

    typedef  signed short      int2;         /* Signed 16 bit value type. */

    typedef  long int          int4;         /* Signed 32 bit value type. */

    typedef  signed long       sint31;       /* Signed 32 bit value */

    typedef  signed short      sint15;       /* Signed 16 bit value */

    typedef  signed char       sint7;        /* Signed 8  bit value */

    3、得到指定地址上的一个字节或字

    #define  MEM_B( x )  ( *( (byte *) (x) ) )

    #define  MEM_W( x )  ( *( (word *) (x) ) )

    4、求最大值和最小值

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

       #define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

    5、得到一个field在结构体(struct)中的偏移量

    #define FPOS( type, field ) /

    /*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */

    6、得到一个结构体中field所占用的字节数

    #define FSIZ( type, field ) sizeof( ((type *) 0)->field )

    7、按照LSB格式把两个字节转化为一个Word

    #define  FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )

    8、按照LSB格式把一个Word转化为两个字节

    #define  FLOPW( ray, val ) /

      (ray)[0] = ((val) / 256); /

      (ray)[1] = ((val) & 0xFF)

    9、得到一个变量的地址(word宽度)

    #define  B_PTR( var )  ( (byte *) (void *) &(var) )

    #define  W_PTR( var )  ( (word *) (void *) &(var) )

    10、得到一个字的高位和低位字节

    #define  WORD_LO(xxx)  ((byte) ((word)(xxx) & 255))

    #define  WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8))

    11、返回一个比X大的最接近的8的倍数

    #define RND8( x )       ((((x) + 7) / 8 ) * 8 )

    12、将一个字母转换为大写

    #define  UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

    13、判断字符是不是10进值的数字

    #define  DECCHK( c ) ((c) >= '0' && (c) <= '9')

    14、判断字符是不是16进值的数字

    #define  HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||/

                           ((c) >= 'A' && (c) <= 'F') ||/

    ((c) >= 'a' && (c) <= 'f') )

    15、防止溢出的一个方法

    #define  INC_SAT( val )  (val = ((val)+1 > (val)) ? (val)+1 : (val))

    16、返回数组元素的个数

    #define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) )

    17、返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)

    #define MOD_BY_POWER_OF_TWO( val, mod_by ) /

               ( (dword)(val) & (dword)((mod_by)-1) )

    18、对于IO空间映射在存储空间的结构,输入输出处理

      #define inp(port)         (*((volatile byte *) (port)))

      #define inpw(port)        (*((volatile word *) (port)))

      #define inpdw(port)       (*((volatile dword *)(port)))

      #define outp(port, val)   (*((volatile byte *) (port)) = ((byte) (val)))

      #define outpw(port, val)  (*((volatile word *) (port)) = ((word) (val)))

      #define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))

    19、使用一些宏跟踪调试

    ANSI标准说明了五个预定义的宏名。它们是:

    __LINE__

    __FILE__

    __DATE__

    __TIME__

    __STDC__

    C++中还定义了 __cplusplus

    如果编译器不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序也许还提供其它预定义的宏名。

    __LINE__ 及 __FILE__ 宏指示,#line指令可以改变它的值,简单的讲,编译时,它们包含程序的当前行数和文件名。

    __DATE__ 宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。

    __TIME__ 宏指令包含程序编译的时间。时间用字符串表示,其形式为:分:秒

    __STDC__ 宏指令的意义是编译时定义的。一般来讲,如果__STDC__已经定义,编译器将仅接受不包含任何非标准扩展的标准C/C++代码。如果实现是标准的,则宏__STDC__含有十进制常量1。如果它含有任何其它数,则实现是非标准的。

    __cplusplus 与标准c++一致的编译器把它定义为一个包含至少6为的数值。与标准c++不一致的编译器将使用具有5位或更少的数值。

    可以定义宏,例如:

    当定义了_DEBUG,输出数据信息和所在文件所在行

    #ifdef _DEBUG

    #define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)

    #else

    #define DEBUGMSG(msg,date)

    #endif

     

    20、宏定义防止错误使用小括号包含。

    例如:

    有问题的定义:#define DUMP_WRITE(addr,nr) {memcpy(bufp,addr,nr); bufp += nr;}

    应该使用的定义: #difne DO(a,b) do{a+b;a++;}while(0)

    例如:

    if(addr)

        DUMP_WRITE(addr,nr);

    else

        do_somethong_else();

    宏展开以后变成这样:

    if(addr)

        {memcpy(bufp,addr,nr); bufp += nr;};

    else

        do_something_else();

    gcc在碰到else前面的“;”时就认为if语句已经结束,因而后面的else不在if语句中。而采用do{} while(0)的定义,在任何情况下都没有问题。而改为 #difne DO(a,b) do{a+b;a++;}while(0) 的定义则在任何情况下都不会出错

     

    21. define中的特殊标识符

    #define Conn(x,y) x##y

    #define ToChar(x) #@x

    #define ToString(x) #x

    int a=Conn(12,34);

    char b=ToChar(a);

    char c[]=ToString(a);

    结果是 a=1234,c='a',c='1234';

    可以看出 ## 是简单的连接符,#@用来给参数加单引号,#用来给参数加双引号即转成字符串。

    展开全文
  • #define中#和##的作用

    千次阅读 2017-02-24 15:27:14
    #define f(a,b) a##b  #define d(a) #a  #define s(a) d(a)  void main( void )  {   puts(d(f(a,b)));   puts(s(f(a,b)));  }  输出结果:  f(a,b)  ab 分析: ##把两个符号连起来  ...
  • javascript中的define用法

    万次阅读 多人点赞 2019-03-05 09:19:43
    最近由于工作需求只能快速学习JS,但在看代码的时候发现许多东西都有疑问比如说代码刚开始的define关键字的用法,刚好最近看了一篇好文章,分享一下。 1. AMD的由来  前端技术虽然在不断发展之中,却一直没有质的...
  • #define

    千次阅读 2019-07-31 15:05:29
    #define #define macro的作用域有点类似于C/C++全局静态变量 编译器处理宏的时机是预处理阶段 编译器按文本顺序处理 遇到宏时就定义一个宏变量 假设这种情况 void test() { #define MACRO 1 } int main() { #...
  • #define 中的 # 和 ##

    千次阅读 2018-03-01 15:49:24
    #define paster( n ) printf( "token " #n" = %d\n ", token ## n ) #define语句中的#是把参数字符串化,##是连接两个参数成为一个整体。注意:#n 两边的引号必须要 ## 两边的空格可有可无,不...
  • C语言中使用二进制常量

    万次阅读 2012-08-10 09:54:07
    C语言标准中针对数值常量,规定了八进制、十进制和十六进制的规则,但是对于常用的二进制则没有规定。 一些编译器厂商,自行扩展了类似0b10001000这样的语法,用来表示二进制数值。 那么如何通过在标准C语言环境中...
  • linux 系统调用号表

    万次阅读 2016-08-15 11:24:43
    位置位于 /usr/include/asm/unistd.h 由于我是64位系统,所以有一些额外的东西。...#define _ASM_X86_UNISTD_H/* x32 syscall flag bit */ #define __X32_SYSCALL_BIT 0x40000000# ifdef __i386__ # in
  • 解决Android平台移植ffmpeg的一揽子问题

    万次阅读 热门讨论 2011-05-30 21:51:00
    IT行业是一个踩在巨人肩膀上前进的行业,否则做的事情不一定有意义,所以我也是基于havlenapetr移植的ffmpeg基础上做了些改进,他做的主要贡献有:1. 移植了ffmpeg并将与媒体相关的结构体在java层重新进行了封装,...
  • arm64-v8a编译

    万次阅读 2016-08-25 16:04:45
    环境:Ubuntu64和android-ndk-r11c(其他不支持arm64-v8a架构) 重点:依赖库要使用android-ndk-r11c编译成arm64-v8a。其中ffmpeg最复杂,编译方法如下: 1、ffmpeg编译 目录建立: ...jni/ffmpeg
  • android ndk 常用宏定义

    万次阅读 2011-08-11 11:06:28
    #define __DBL_MIN_EXP__ (-1021) #define __FLT_MIN__ 1.17549435e-38F #define __CHAR_BIT__ 8 #define __ANDROID__ 1 #define __WCHAR_MAX__ 4
  • verilog define 用法

    万次阅读 2014-06-17 15:48:02
    典型用法:  在module外定义
  • VC/MFC 键盘消息的截取与响应

    万次阅读 2011-10-17 10:38:09
    http://hi.baidu.com/ruwind2010/blog/item/654e10d36563bc83a0ec9cbd.html 在MFC(Microsoft Foundation Class)对响应消息进行了封装, 可以通过重载虚函数PreTransla
  • linux下错误的捕获:errno和strerror的使用经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因。...
  • 非阻塞IO处理上几个常见问题

    万次阅读 2009-11-03 11:36:00
    Operation now in progress 原因:把socket设为非阻塞,connect时候就会返回“Operation now in progress”,这表示连接已经在建立但还没有完成,随后加上select来实现connect超时,但理论上不会把该错误信息返回给...
  • const与#define相比,区别和优点超详解总结!

    万次阅读 多人点赞 2018-08-23 15:14:07
    (1)就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。 (2)就起作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行...
  • C/C++ #define的作用域问题

    千次阅读 2011-06-30 15:11:00
    #include "definetest.h"#include #include using namespace std;definetest::definetest(void){}definetest::~definetest(void){}void definetest::todefine(){#define TESTDEFI
1 2 3 4 5 ... 20
收藏数 1,817,847
精华内容 727,138
关键字:

define