消息码和消息描述字符串关联的一种实现

若定义JMESSAGE(code,string)code ,宏,就表示enum list of message codes.

若定义JMESSAGE(code,string)string ,宏,就可表示a message string table.

==========================================================================

<jerror.h>

 1 #ifndef JMESSAGE
 2 #ifndef JERROR_H
 3 /* First time through, define the enum list */
 4 #define JMAKE_ENUM_LIST
 5 #else
 6 /* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
 7 #define JMESSAGE(code,string)
 8 #endif /* JERROR_H */
 9 #endif /* JMESSAGE */
10
11 #ifdef JMAKE_ENUM_LIST
12
13 typedef enum {
14
15 #define JMESSAGE(code,string)    code ,
16
17 #endif /* JMAKE_ENUM_LIST */
18
19 JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */
20
21 /* For maintenance convenience, list is alphabetical by message code name */
22 JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix")
23 JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
24 ......
25 ......
26 ......
27 JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG")
28 JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines")
29
30 #ifdef JMAKE_ENUM_LIST
31
32   JMSG_LASTMSGCODE
33 } J_MESSAGE_CODE;
34
35 #undef JMAKE_ENUM_LIST
36 #endif /* JMAKE_ENUM_LIST */
37
38 /* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
39 #undef JMESSAGE

那么,在.c文件中怎样使用message codes和对应的message desription string呢?

1 #include “jerror.h”//这一次是为了定义enum list of message codes
2 #define JMESSAGE(code,string)    string ,
3
4 const char * const jpeg_std_message_table[] = {
5 #include "jerror.h"//这一次是为了定义message string table
6   NULL
7 };

上述的代码复用率就非常高。

预编译后的形式如下:

 1 # 1 "main.c"
 2 # 1 "<built-in>"
 3 # 1 "<command-line>"
 4 # 1 "/usr/include/stdc-predef.h" 1 3 4
 5 # 1 "<command-line>" 2
 6 # 1 "main.c"
 7
 8 # 1 "jerror.h" 1
 9 # 19 "jerror.h"
10 typedef enum {
11
12 JMSG_NOMESSAGE ,
13
14
15 JERR_ARITH_NOTIMPL ,
16
17 JERR_BAD_ALIGN_TYPE ,
18 JERR_BAD_ALLOC_CHUNK ,
19 JWRN_JPEG_EOF ,
20 JWRN_MUST_RESYNC ,
21
22 JWRN_NOT_SEQUENTIAL ,
23 JWRN_TOO_MUCH_DATA ,
24
25
26
27   JMSG_LASTMSGCODE
28 } J_MESSAGE_CODE;
29 # 3 "main.c" 2
30
31
32
33 const char * const jpeg_std_message_table[] = {
34 # 1 "jerror.h" 1
35 # 25 "jerror.h"
36 "Bogus message code %d" ,
37
38
39 "Sorry, there are legal restrictions on arithmetic coding" ,
40
41 "ALIGN_TYPE is wrong, please fix" ,
42 "MAX_ALLOC_CHUNK is wrong, please fix" ,
43 "Premature end of JPEG file" ,
44 "Corrupt JPEG data: found marker 0x%02x instead of RST%d" ,
45
46 "Invalid SOS parameters for sequential JPEG" ,
47 "Application transferred too many scanlines" ,
48 # 8 "main.c" 2
49  NULL
50 };
51
52 int main(int argc, char** argv)
53 {
54
55  printf("%s\n", jpeg_std_message_table[JERR_ARITH_NOTIMPL]);
56
57  return 0;
58 }

若定义JMESSAGE(code,string)code ,宏,就表示enum list of message codes.

若定义JMESSAGE(code,string)string ,宏,就可表示a message string table.

时间: 2024-10-13 01:30:04

消息码和消息描述字符串关联的一种实现的相关文章

Android 基于Netty的消息推送方案之字符串的接收和发送(三)

在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> ,我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffer的东东. ChannelBuffer Netty中的消息传递,都必须以字节的形式,以ChannelBuffer为载体传递.简单的说,就是你想直接写个字符串过去,对不起,抛异常.虽然,Netty定义的writer的接口参数是Object的,这可能也是会给新上手的朋友容易造成误会的地方.Netty源码中,是这样

原生socket请求url获取状态码、消息报头、响应正文

需求: 1 (1)使用socket及ssl模块写通用的web客户端 2 (2)向服务器发起请求 3 (3)接受响应内容并解析出状态码.消息报头.响应正文 4 (4)最核心的函数: 输入一个url,返回状态码.消息报头.响应正文:当然这也是最后实现的效果 知识储备: 网络基础知识 python的web编程(socket) 最后实现代码: 1 # __author__ = "wyb" 2 # date: 2018/6/5 3 # 代码: 高内聚低耦合 -> 使用函数封装一些逻辑代码

源码解析——消息机制

映象笔记的链接:源码解析--消息机制

RocketMQ源码解析-消息消费

RocketMQ源码解析-消息消费 1.消费者相关类 2.消费者的启动 3.消息的拉取 4.消费者的负载均衡 5.消息的消费 6.消费进度管理 看了很多遍的代码,还是决定动手把记录下来,梳理一下整体结构和实现细节,给大家一个参考,写的不好的地方请多多指教 RocketMQ中消息的消费分为2种方式,一种是pull模式,一种为push模式(基于pull模式实现),大部分的业务场合下业界用的比较多的是push模式,一句话你没有特殊需求就用push,push模式可以达到准实时的消息推送 那什么时候可以用

鼠标消息与键盘消息

在Microsoft Windows 中,键盘和鼠标是两个标准的用户输入源,在一些交叠的操作中通常相互补充使用.当然,鼠标在今天的应用程序中比10年前使用得更为广泛.甚至在一些应用程序中,我们更习惯于使用鼠标,例如在游戏.画图程序.音乐程序,以及Web创览器等程序中就是这样.然而,我们可以不使用鼠标,但绝对不能从一般的PC中拆掉键盘. 相对于个人计算机的其他组件,键盘有非常久远的历史,它起源于1874年的第一台Remington打字机.早期的计算机程序员用键盘在 Hollerith卡片上打孔,以

微信公众号开发教程[003]-消息管理-接收消息

当微信用户向公众号发送消息时,微信服务器会向公众号配置的服务器URL地址发送请求,并将相关内容包装成一定格式的xml发送到这个服务器;响应时,这个服务器只要回复特定格式的xml字符串给微信服务器,微信服务器即可向微信用户的客户端转发这条回复消息.(假设公众号开发模式已开启,以后的教程,如果没有特别说明,都是如此).如下图: 例如,文本消息的xml结构如下: <xml> <ToUserName><![CDATA[toUser]]></ToUserName> &

微信公众号开发C#系列-6、消息管理-普通消息接受处理

1.概述 通过前面章节的学习,我们已经对微信的开发有了基本的掌握与熟悉,基本可以上手做复杂的应用了.本篇我们将详细讲解微信消息管理中普通消息的接收与处理.当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上.接收普通消息微信官方文档参考:接收普通消息文档API 消息接收后,就有一个处理或回复的过程,单单发送消息了没有响应也是不人性化的,下面我们就对接收到微信各类型消息分别讲解处理的方法. 2.消息接收 当普通微信用户向公众账号发消息时,微信服务器会先接收

第三篇 :微信公众平台开发实战之请求消息,响应消息以及事件消息类的封装

微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者配置的URL和Token 来找到第三方服务器,并以XML形式向第三方服务器发送消息. (3)第三方服务器获取这些消息之后,需要按照微信服务器传过来的XML的语言进行解析,获取到信息之后,根据用户的需求,提供服务,然后封装成XML数据,传回到微信服务器上去. (4)微信服务器解析这些XML,并把相应的

(转)(二)RabbitMQ消息队列-RabbitMQ消息队列架构与基本概念

http://blog.csdn.net/super_rd/article/details/70238869 没错我还是没有讲怎么安装和写一个HelloWord,不过快了,这一章我们先了解下RabbitMQ的基本概念. RabbitMQ架构 说是架构其实更像是应用场景下的架构(自己画的有点丑,勿嫌弃) 从图中可以看出RabbitMQ主要由Exchange和Queue两部分组成,然后通过RoutingKey关联起来,消息投递到Exchange然后通过Queue接收. RabbitMQ消息队列基本概