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)
这是一个很好的问题,我很想知道人们有更好的方式
在生成的代码中流行的另一种方法是:
#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方式,但是根据代码的结构,在构建过程中自动生成该数组可能会更容易