我正在对一些代码进行反向工程,并遇到了这个问题。

/************************************************************************/
/*                                                                      */
/*                          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。我会说是的,这是宏观滥用。

10-07 17:56