c – “#define”和内联行为是否相同?
我在我的一个标题中有一些简短的定义,如下所示:
#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; } 可以将字符串传递给执行某种整数运算的宏,并且宏不会抱怨! – 建议还是命令? 内联只是对编译器的建议.编译器决定是否内联扩展函数. 宏将永远扩展. – 调试怎么样? 内联函数可以轻松调试,因为您可以在内联函数定义中设置断点并逐步进入调试方法. 宏不能用于调试,因为它们在预编译时扩展. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |