精华内容
下载资源
问答
  • 宏定义括号

    千次阅读 2014-01-05 22:53:18
    为了尽量避免边际效应,宏定义时常要注意括号的使用。 例如在编写一个简单的MIN宏时,我们需要加上足够括号才能保证结果尽可能的正确。 #define MIN(X,Y) ((X) 小提醒:在宏定义中最好全部使用大写字母,以...
    为了尽量避免边际效应,宏定义时常要注意括号的使用。
    


    例如在编写一个简单的MIN宏时,我们需要加上足够括号才能保证结果尽可能的正确。
    #define MIN(X,Y) ((X)<(Y)?(X):(Y))
    小提醒:在宏定义中最好全部使用大写字母,以区别正规的代码。


    但有些情况下,加上括号却是“画蛇添足”的。
    例如,用预处理指令#define声明一个常数,用以表明1年中有多少秒。
    #define SECONDS_PER_YEAR (60*60*24*365)UL
    单纯这一条宏定义是没有什么错误的,但如果替换到源代码中就会出现语法错误。
    哪里错了呢?错在不应该加括号。
    在整数值后面添加L或者l(小写的L,为了避免视觉错误最好使用L),表示此整数为long整型。
    在整数值后面添加U或者u,表示此整数为unsigned整型。
    如果各添加一个,也就是都在整数值直接加上后面加上U和L,那就表示unsigned long int型。
    数值后面直接加U或者L才行,前边加上括号就不行了。
    所以,正确的写法应该是这样
    #define SECONDS_PER_YEAR 60*60*24*365UL
    或者
    #define SECONDS_PER_YEAR 60*60*24*365LU
    L和U不分前后,但从可读性的角度来讲在数值后面加UL更符合我们的阅读习惯。


    总结,宏定义会暗藏很多意想不到的危险,而搭配括号可以减小这种危险出现的可能性,但从根本而言改变不了宏定义的本质(字符替换)。
    展开全文
  • 宏定义参数加括号

    千次阅读 2018-09-28 15:39:08
    括号是为了处理表达式参数(即的参数可能是个算法表达式)时不...显然这是和COM的意图一致的,但是如是去掉了定义括号,即写成这样: #define COM(A,B) A*B 那么COM(6+5,3)它就会换成这样: 6+5*3 这样显然就...

    加括号是为了处理表达式参数(即宏的参数可能是个算法表达式)时不出错,因为宏替换就是文本替换。

    比如以下情况:

    #define COM(A,B) (A)*(B)

    那么COM(6+5,3)它会换成这样: (6+5)*(3)

    显然这是和COM宏的意图一致的,但是如是去掉了定义中括号,即写成这样:

    #define COM(A,B) A*B

    那么COM(6+5,3)它就会换成这样: 6+5*3

    这样显然就和宏的意图不符合了。

    展开全文
  • 宏定义要加括号

    2014-02-18 15:32:00
    #define DI_INPUT_NUM 11+2int a = DI_INPUT_NUM * 3那么a = 11+2 *3 = 11+6 =17#define DI_INPUT_NUM (11+2)int a = DI...上面2中情况可以看到第二种才是宏定义的本意。所以习惯性会加个括号,其实空定义不管是数字...

    #define DI_INPUT_NUM  11+2
    int a = DI_INPUT_NUM * 3
    那么a = 11+2 *3 = 11+6
    =17

    #define DI_INPUT_NUM  (11+2)
    int a = DI_INPUT_NUM * 3
    那么 a
    =(11+2)*3 = 13*3=39

    上面2中情况可以看到第二种才是宏定义的本意。
    所以习惯性会加个括号,其实空定义不管是数字或者表达式,都必须加括号,这是编程的很好习惯。

    转载于:https://www.cnblogs.com/Yogurshine/p/3554346.html

    展开全文
  • c代码-括号宏定义的影响
  • 宏定义中的括号重要性

    千次阅读 2012-09-22 18:13:09
    最近在用宏定义时,总是得不到正确的结果,最后才发现是由于宏定义中缺少了括号所致,故特作此文,以警人警己。 比如: #define MIN(a, b) a > b ? b : a 这样定义也不是每次都有问题。如果用到这个宏的代码像...

    最近在用宏定义时,总是得不到正确的结果,最后才发现是由于宏定义中缺少了括号所致,故特作此文,以警人警己。

    比如:

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

    这样定义也不是每次都有问题。如果用到这个宏的代码像这样,MIN(3, 5) / 2就有问题了。

    所以需要改成这样:

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

    即使这样,也会有问题。我举不出例子,微软的代码里是这样的:#define MIN(a,b)  ((a) > (b) ? (b) : (a))

    看另一个宏:

    #define MULTIPLY(a,b) (a*b)

    这里没有给a,b加括号。

    使用时,MULTIPLY(3+2,5) 的结果为13,不是用户希望的25,所以要给输入变数加括号。

     

     

    展开全文
  • } 对于宏定义后面加斜杠的说法主要解释是仅仅充当一个回车键的效果,如果不这么写,就会出现一些奇葩的错误,就像下面2种情况一样,深有体会。 1.不加斜杠的错误 2.括号不紧挨着define的错误 这种情况就算加了斜杠...
  • 宏定义和大括号以及斜杠

    千次阅读 2016-03-22 09:59:11
    今天看到别人的C++的宏定义,从来没见过的定义。所以百度了一下 #define ESCAPE_INVALID_CHAR(pbuf){\ while(pbuf && *pbuf == ',' || *pbuf == ' ' || *pbuf == '\n' || \ *pbuf == '(' || *pbuf == ')' || *...
  • 宏定义#define括号使用的深入认识

    千次阅读 2016-01-09 19:45:22
    宏定义:注意x,y值都有一个括号,和特定的符号时 需要加上括号! // SWAP(x, y) 交换x,y的值 #define SWAP(x, y) \  (y) = (x) + (y); \  (x) = (y) - (x); \  (y) = (y) - (x); 求最大值和最小值  #...
  • 宏定义表达式—完备括号问题

    千次阅读 2016-06-28 15:38:37
    *#define RECTANGLE_AREA(a, b) (a) (b);则RECTANGLE_AREA(c + d, e + f)将扩展成: (c + d * e + f), d与e 先运算,造成错误** //...(1)上面的解释,应该是对应以下宏定义而言: #define RECTANGLE_AREA(a, b) (a
  • 宏定义中的参数需要括号的原因

    千次阅读 2012-08-29 10:29:37
    括号是为了处理表达式参数(即的参数可能是个算法表达式)时不出错,因为替换就是文本替换,所以如果...显然这是和COM的意图一致的,但是如是去掉了定义括号,即写成这样: #define COM(A,B) A*B 那么
  • 宏定义有无参数宏定义和带参数宏定义两种。 无参数的宏定义的一般形式为 # define 标识符 字符序列 其中# define之后的标识符称为宏定义名(简称宏名),要求宏名与字符序列之间用空格符分隔。这种宏定义要求编译...
  •  //这个右花括号'}'的位置,应该和上个左花括号'{' 对齐,位置不要随便   } #ifdef TWO  printf("TWO \n"); } #endif int main() {  fun();  return 0; } .
  • 1、宏定义说明 宏定义是比较常用的预处理指令,即使用“标识符”来表示“替换列表”中的内容。标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏定义中替换列表中的内容。 常见的宏定义有两...
  • 宏定义中容易引起许多运算优先级的问题,需要括号加以约束 例如 #define abs(x) x>0?x:-x abs(a-b); abs(a)+1; 带入展开后,结果如下: a-b>0?a-b:-a-b; a>0?a:-a+1; 以上两个式子的运算优先级完全混乱。 ...
  • #define QUICK (1) //最快 #define EARLY (2) //最早 #define CHEAP (3) //最省 switch (iReqKind) ...1. 宏定义中 的 括号 是为了 程序 的健壮性 和 规范性。 2. cast (1): 等价于 case 1:
  • 宏定义是比较常用的预处理指令,即使用“标识符”来表示“替换列表”中的内容。标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏定义中替换列表中的内容。 常见的宏定义有两种,不带参数的...
  • 宏定义

    千次阅读 多人点赞 2016-10-09 14:17:22
    宏定义是替换,不做计算,也不做表达式求解。简称宏。 格式:#define 标识符 字符串 说明: (1)宏名一般用大写 (2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如...
  • 网上复制的组播代码,略有问题,无头文件,服务端宏定义处发现多了个“;”——顺手删了,没关心宏定义,主要是添加头文件,编译成功。 当时以为只是画蛇添足,删不删就是个习惯,对结果影响不大,没想到会是错误...
  • 一、不带参数的宏定义 1.定义 2.#undef 指令取消宏定义 二、带参数的宏定义 1.定义 2.宏定义参数替换的注意事项 三、带参数的宏定义和带参函数的区别 一、不带参数的宏定义 1.定义 在程序中,经常会定义...
  • 宏定义,记得要注意加括号的地方

    千次阅读 2013-01-31 21:54:46
    宏定义:注意x,y值都有一个括号,和特定的符号时 需要加上括号! // SWAP(x, y) 交换x,y的值 #define SWAP(x, y) \  (y) = (x) + (y); \  (x) = (y) - (x); \  (y) = (y) - (x); 求最大值和最小值...
  • 尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现...
  • C语言宏定义宏定义函数

    千次阅读 2017-03-27 15:31:39
    要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。  在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装...
  • 宏定义是比较常用的预处理指令,其原理就是替换,即使用“标识符”来表示“替换列表”中的内容。标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏定义中替换列表中的内容。 常见的宏定义有...
  • C语言的头文件和宏定义详解

    万次阅读 多人点赞 2018-01-24 21:00:44
    之前对C语言的头文件和宏定义抱着一知半解的态度,现理清思路并以文字的形式整理出来,以供不时之需 头文件 头文件,顾名思义就是定义在C语言文件头部的那一坨东西 #include 这就是一个标准输入输出的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,044
精华内容 24,417
关键字:

宏定义需要括号吗