加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – “#define”和内联行为是否相同?

发布时间:2020-12-16 10:43:15 所属栏目:百科 来源:网络整理
导读:我在我的一个标题中有一些简短的定义,如下所示: #define ROUND_DOWN(a,b) (a)-(a)%(b) 例如 ROUND_DOWN(178,32) = 160 但是,如果我把它传递给它: ROUND_DOWN(160*2,32); 然后它像这样编译? (160*2)-(160*2)%(32), 这只是处理160 * 2两次.. 我想知道内联函
我在我的一个标题中有一些简短的定义,如下所示:

#define ROUND_DOWN(a,b)   (a)-(a)%(b)

例如

ROUND_DOWN(178,32) = 160

但是,如果我把它传递给它:

ROUND_DOWN(160*2,32);

然后它像这样编译?

(160*2)-(160*2)%(32),

这只是处理160 * 2两次..

我想知道内联函数是否以相同的方式运行?例如

inline int RoundDown(int a,int b)
{
return (a)-(a)%(b)
}

将160 * 2作为320存储在“int a”中,然后计算会起作用,还是它的行为与定义相同?

一个更好的例子是:

RoundDown((x+x2)*zoom,tile_width);

解决方法

“#define”和内联行为是否相同?

不,他们不!

宏和内联函数之间存在许多差异.

– 没有评估时间

作为内联函数的参数传递的表达式将被计算一次.

在某些情况下,作为参数传递给宏的表达式可以多次计算.
每次在宏中使用参数时,都会评估该参数.

代码示例:

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

int main()
{

  int a = 0;
  int b = 1;

  int c = max(a++,b++);

  cout << a << endl << b << endl;
  return 0;

}

意图可能是打印1和2,但宏扩展为:

int c = a++ > b++ ? a++ : b++;

b增加两次,程序打印1和3.

– 谁评估他们

内联函数由编译器评估,而预编译器在预编译时评估宏.

– 类型检查

内联函数遵循在正常函数上强制执行的所有类型安全协议.
检查参数类型,并正确执行必要的转换.
在将内联函数放入符号表之前,编译器执行返回类型检查,函数签名.
它们可以被重载以对正确类型的数据执行正确的操作.

与内联函数相比,宏更容易出错.参数未键入(宏适用于任何算术类型的对象).
编译期间未进行错误检查.

代码示例:

#define MAX(a,b) ((a < b) ? b : a)

int main( void)
{
   cout << "Maximum of 10 and 20 is " << MAX("20","10") << endl;
   return 0;
}

可以将字符串传递给执行某种整数运算的宏,并且宏不会抱怨!

– 建议还是命令?

内联只是对编译器的建议.编译器决定是否内联扩展函数.

宏将永远扩展.

– 调试怎么样?

内联函数可以轻松调试,因为您可以在内联函数定义中设置断点并逐步进入调试方法.

宏不能用于调试,因为它们在预编译时扩展.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读