我正在对一些代码进行反向工程,并遇到了这个问题。
/************************************************************************/
/* */
/* MACRO CHECK_FREAD */
/* */
/* CHECK_FREAD is used to check the status of a file read. It */
/* is passed the return code from read and a string to print out if */
/* an error is detected. If an error is found, an error message is */
/* printed out and the program terminates. This was made into a */
/* macro because it had to be done over and over and over . . . */
/* */
/************************************************************************/
#define CHECK_FREAD(X, msg) if (X==-1) \
{ \
return(DCD_BADREAD); \
}
基本上,此文件中的一组特定函数在每次执行(c读)检查结果是否有错误时都调用此函数。他们也对EOF进行了类似的检查...就我所知,基本上,他们是以这种方式在错误的中间位置插入错误返回的方法。
例如
/* Read in an 4 */
ret_val = read(fd, &input_integer, sizeof(int32));
CHECK_FREAD(ret_val, "reading an 4");
CHECK_FEOF(ret_val, "reading an 4");
if (input_integer != 4)
{
return(DCD_BADFORMAT);
}
/* Read in the number of atoms */
ret_val = read(fd, &input_integer, sizeof(int32));
*N = input_integer;
CHECK_FREAD(ret_val, "reading number of atoms");
CHECK_FEOF(ret_val, "reading number of atoms");
现在,我只是重新开始使用c/c++编程,并且一开始我从没有使用过太多宏,但是这种宏滥用是吗?
我读了这个...
When are C++ macros beneficial?
...而且听起来不像任何犹太例子,所以我的猜测是"is"。但是我想获得更明智的见解,而不仅仅是做出有根据的猜测... :)
... errr,使用某种包装会更好吗?
最佳答案
因为不一样。如果将相同的内容放入函数中,则将有一个简短的函数,如果DCD_BADWRITE
等于-1,则该函数会返回X
。但是,所讨论的宏是从包含函数返回的。例子:
int foobar(int value) {
CHECK_FREAD(value, "Whatever");
return 0;
}
将扩展为:
int foobar(int value) {
if (value == -1) {
return (DCD_BADWRITE);
};
return 0;
}
但是,如果它是一个函数,则外部函数(
foobar
)将很乐意忽略结果并返回0。宏看起来非常像一个函数,但是在关键方式上却表现出不同,它是一个主要的“禁止” IMO。我会说是的,这是宏观滥用。