类似函数的宏和枚举器具有相同的名称

时间:2019-03-14 09:26:16

标签: c macros c-preprocessor

在以下片段中,我有一个struct IndexError 当用户使用我的库出错时返回。我有一个类似于函数的宏,该宏将指向IndexError*的指针和一个枚举都称为INDEX_ERROR

enum errors {
    SUCCESS,
    INVALID_ARGUMENT,
    INDEX_ERROR
};

struct Error {
    char error_buff[BUFSIZ];
};

typedef struct Error Error;

struct IndexError {
    Error  parent;
    size_t invalid_index;
    // etc.
};

typedef struct IndexError IndexError;


#define INDEX_ERROR(obj) ((IndexError*) obj)

我将如何使用它的一个示例是:

size_t pos = 4;
int IndexPointer* error = NULL;
int status = array_remove_item(my_array, pos, &error);

然后我检查状态。如果它没有返回SUCCESS,我将检查该错误,因为那应该指向一个新创建的错误。

其中一个数组函数的实现可能看起来像这样:

int array_remove_item(Array* array, size_t pos, Error** error_out)
{
    Error* error = NULL;
    if(pos >= array->size) {
        index_error_create(INDEX_ERROR(&error), pos); // use casting macro.
        *error_out = error;
        return INDEX_ERROR; // is this the macro or the value from the errors enum?
    }
    priv_array_remove_item(array, pos);
    return SUCCESS;
}

所以我的问题是,在return INDEX_ERROR;INDEX_ERROR会从枚举中返回值,还是因为我的命名不便,预处理器会咬我吗?

1 个答案:

答案 0 :(得分:7)

return INDEX_ERROR; // is this the macro or the value from the errors enum?

它是枚举数。它不可能是扩展类似函数的宏的结果,因为它不会紧跟左括号(,因为预处理程序需要 1

不过,它有点臭。宏和枚举器的不同名称将使代码更清晰,更清晰,而无需阅读语言规范的精巧印刷。


1 - n1570 6.10.3p10 "Each subsequent instance of the function-like macro name followed by a ( as the next preprocessing token introduces the sequence of preprocessing tokens that is replaced by the replacement list in the definition"