C-一个有关宏的问题

C-一个有关宏的问题

甜柠檬 发布于 2016-12-16 字数 241 浏览 1255 回复 6

如图

这种情况,有没有办法给出一个错误号就能返回一个错误字符串。比如给0x00就返回"ERR_SUCCESS"?

还是只能自己手工把字符串敲出来存在字符串数组里?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

虐人心 2017-09-23 6 楼

如果没有现成的库,建议自己做一个.h文件,将它们包含进去。以后你要用时直接在文件中包含进去就行了。

夜无邪 2017-07-30 5 楼

还是字符串数组吧,00-09当下标吧

浮生未歇 2017-06-05 4 楼

在上个世纪,有人发明了一个叫X Macro的东西,来干这个事情。
一点点的示例代码如下

 #include <stdio.h>
/* add new error message by adding one line here */
#define ERR_TABLE
X(ERR_SUCCESS, 0x00, "ERR_SUCCESS")
X(ERR_TYPE_MISMATCH, 0x01, "ERR_TYPE_MISMATCH")
X(ERR_NOT_FOUND, 0x02, "ERR_NOT_FOUND")

/* define the ERR value */
#define X(a, b, c) a = b,
enum ERRS {
ERR_TABLE
};
#undef X

/* define error name */
#define X(a, b, c) c,
char * err_name[] = {
ERR_TABLE
};
#undef X

int main ()
{
printf("err %d is %sn", ERR_TYPE_MISMATCH, err_name[ERR_TYPE_MISMATCH]);
return 0;
}

更多详细的就不多扯了,这里说了
The New C: X Macros(http://www.drdobbs.com/the-new-c-x-macros/184401387)

想挽留 2017-06-02 3 楼

如果这些消息是windows系统定义的错误消息的话,可以通过FormatMessage函数把错误代码转换为错误消息。函数声明如下

DWORD WINAPI FormatMessage(
  __in DWORD dwFlags,
  __in_opt LPCVOID lpSource,
  __in DWORD dwMessageId,
  __in DWORD dwLanguageId,
  __out LPTSTR lpBuffer,
  __in DWORD nSize,
  __in_opt va_list *Arguments
  );

若是自己定义的话,可以用一个map来存一下,每个id对应一个text,在输出错误消息的时候,根据相应ID输出相应的错误文本。

std::map<UINT,CString>//建立错误ID与字符串的映射

泛泛之交 2017-02-18 2 楼

我觉得你的工程应该是一个比较大的工程,即使有现成的库也没必要用,像类似的这些枚举、常量、字符串等的定义最好自己统一写在一个头文件里面,因为工程中可能很多地方都要用到。
你这个可以写成一个Map或字符串数组。

夜无邪 2016-12-29 1 楼

我理解是想利用已有的一些宏定义直接字符串化输出,因为这些宏的名字本身就有了一些意义,比较容易读懂,起码比 0,1,2,3这些数字强多了。

第一次贴的时候居然失败了,这是打第二次字。。。悲剧啊。。。
主要思路就是利用c/c++预处理中的#运算符,上代码吧,多说不会。

----------------file Main.cpp----------------------------------------
#include <iostream> //c++标准输入输出头文件
#include <stdio.h> //要是c编译器就包含这个
#define MacroFormatOut(x) #x //用#运算符字符串x

#define ERROR_SUCCESS 0x00
#define ERROR_1 0x01
//其他已有宏定义不写啦,反正有几个有点意思的宏 :)

int main() {
std::cout << MacroFormatOut(ERROR_SUCCESS) << std::endl;
printf("%s", MacroFormatOut(ERROR_1) );
return 0;
}
--------------file end-----------------------------------------------

输出结果:
ERROR_SUCCESS
ERROR_1