将函数定义为简写
Defining functions to shorthand
有时在编码竞赛中,我会看到类似的东西
#define FOR(a,b,c) for (i64(a)=(b);(a)<(i64)(c);(a)++)
这是否被认为是好的/坏的做法,是否有其他影响(对性能、稳定性等)。
基本上,如果键入FOR(a,b,c)
"更短",为什么不总是这样做呢?
在运行时,它的性能不应该比完全编写的版本差。这是因为预处理器宏在编译之前会被扩展,所以它对编译器看到的内容没有影响。
反对它的主要论据可能是可读性。你必须确切地知道FOR
将扩展到什么,并确保它符合你的预期。对于一次性项目或原型来说,这可能不是问题。在更大或更长期的项目中,你可能会发现它会成为一种负担,尤其是当你试图调试循环时。
它的效率并不高。它确实保证了每次都以同样的方式做同样的事情。通常使用一个函数,但宏可能会保存函数调用,在某些情况下,这会更有效。
为什么不总是使用宏?因为您可能并不总是需要i64强制转换,这就是为什么for循环作为一个通用构造存在的原因。
我个人避免使用宏,除非我真的离不开它们。
来自谷歌C++风格指南
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Preprocessor_Macros:
宏意味着你看到的代码与编译器看到的代码不同。这可能会引入意外行为,尤其是因为宏具有全局作用域。
在编码竞赛中,人们使用书中的每一个技巧来减少事情。
这是个好做法吗。
我认为原因不简单——维护。
此外,IMHO宏也是一个非常糟糕的主意。
相关文章:
- 在命名空间中定义函数还是限定函数
- 为什么在定义函数之前先声明它
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 这个c++代码是如何在没有定义函数的情况下运行的
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 将自定义函数传递到基抽象类中以延迟执行
- C++使用 rand 定义函数语法
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 将具有固定签名的自定义函数名称注入 CRTP
- 使用定义函数模板别名
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 在内联程序集中定义函数和从 C++ 调用时出现问题
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 朋友定义函数的名称空间是什么
- 介子 对用户定义函数的未定义引用
- 如何使用 "using" 关键字定义函数原型/签名
- 在 C 结构中定义C++函数