可以将#defines列表转换为字符串

bra*_*onC 11 c++ string literals c-preprocessor

假设我#define在外部库的头文件中有一个s 列表.这些#define代表从函数返回的错误代码.我想编写一个转换函数,它可以将错误代码作为输入,并作为输出返回表示实际#define名称的字符串文字.

举个例子,如果我有

#define NO_ERROR 0
#define ONE_KIND_OF_ERROR 1
#define ANOTHER_KIND_OF_ERROR 2
Run Code Online (Sandbox Code Playgroud)

我想要一个能够调用的函数

int errorCode = doSomeLibraryFunction();
if (errorCode)
    writeToLog(convertToString(errorCode));
Run Code Online (Sandbox Code Playgroud)

并且convertToString()能够自动转换该错误代码,而不是一个巨大的开关盒

const char* convertToString(int errorCode)
{
    switch (errorCode)
    {
        case NO_ERROR:
           return "NO_ERROR";
        case ONE_KIND_OF_ERROR:
           return "ONE_KIND_OF_ERROR";
        ...
     ...
...
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,如果这是可能的,那么可以使用模板和元编程,但这只会使错误代码实际上是一种类型,而不是一堆处理器宏.

Mic*_*zek 19

我通常使用巨型开关盒方式,虽然我使用它更容易:

#define STR(code) case code: return #code
switch (errorCode)
{
    STR(NO_ERROR);
    STR(ONE_KIND_OF_ERROR);
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的问题,我很想知道人们有更好的方式


Mic*_*zek 6

在生成的代码中流行的另一种方法是:

#define NO_ERROR 0
#define ONE_KIND_OF_ERROR 1
#define ANOTHER_KIND_OF_ERROR 2
static const char* const error_names[] = {"NO_ERROR", "ONE_KIND_OF_ERROR", "ANOTHER_KIND_OF_ERROR"};

const char* convertToString(int errorCode) {return error_names[errorCode];}
Run Code Online (Sandbox Code Playgroud)

我更喜欢我已经提到的switch case方式,但是根据代码的结构,在构建过程中自动生成该数组可能会更容易