gpt4 book ai didi

c++ - "#define"和 inline 的行为是否相同?

转载 作者:太空狗 更新时间:2023-10-29 19:37:35 27 4
gpt4 key购买 nike

我的一个标题中有一些简短的定义,如下所示:

#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。

- 谁来评估他们

内联函数由编译器求值,而宏由预编译器在预编译时求值。

- 类型检查

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

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

代码示例:

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

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

可以将字符串传递给执行一些整数运算的宏,而宏不会报错!

- 建议还是命令?

Inline 只是给编译器的一个建议。是否展开内联函数由编译器决定。

宏将始终展开。

- 调试如何?

内联函数很容易调试,因为你可以在内联函数定义处打断点,一步步进入调试方法。

宏不能用于调试,因为它们会在预编译时展开。

关于c++ - "#define"和 inline 的行为是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6584586/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com