【发布时间】:2012-07-04 16:51:08
【问题描述】:
我就宏及其可读性进行了辩论。 我认为在某些情况下使用宏可以使代码更短、更易于理解并且阅读起来不那么累。
例如:
#include <iostream>
#define EXIT_ON_FAILURE(s) if(s != 0) {std::cout << "Exited on line " << __LINE__ << std::endl; exit(1);}
inline void exitOnFailure(int s, int lineNum) {
if (s != 0) {
std::cout << "Exited on line " << lineNum << std::endl;
exit(1);
}
}
int foo() {
return 1;
}
int bar(int a, int b, int c) {
return 0;
}
int main() {
// first option
if (foo() != 0) {
std::cout << "Exited on line " << __LINE__ << std::endl;
exit(1);
}
if (bar(1, 2, 3) != 0) {
std::cout << "Exited on line " << __LINE__ << std::endl;
exit(1);
}
// second option
EXIT_ON_FAILURE(foo());
EXIT_ON_FAILURE(bar(1, 2, 3));
// third option
exitOnFailure(foo(), __LINE__);
exitOnFailure(bar(1, 2, 3), __LINE__);
return 0;
}
我更喜欢这里的第二个选项,因为它简短紧凑,而且大写锁定文本比驼峰式大小写更清晰易读。
这种方法有什么问题吗,尤其是在 C++ 中,或者它只是不好(但可以接受)的风格?
【问题讨论】:
-
如果你传入
__LINE__,你可以对函数做同样的事情。 -
我会说 C 中的宏没有任何问题。另一方面,在 C++ 中,它们就像牌匾:最好避免使用!仅他们不遵循作用域这一事实就应该表明宏是多么邪恶!
-
我通常两者都做:像
exitOnFailure这样的函数和只传递参数的宏EXIT_ON_FAILURE`加上__FILE__、__LINE__和__func__。 -
@MFH 他们是一块牌匾?使用these?我想你的意思是瘟疫。
-
看来您正在重新发明 assert() 宏。
标签: c++ c code-readability