zoukankan      html  css  js  c++  java
  • 消息码和消息描述字符串关联的一种实现

    若定义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
    ", 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.

  • 相关阅读:
    svn服务器安装
    查看IIS应用程序池的运行状况
    Microsoft Web Farm Framework 和 server Farms
    Subversion 错误信息一览表
    LINUX 时间和日期
    DiskGenius的 “终止位置参数溢出”错误解决方法。
    TortoiseSVN在网盘显示图标的设置
    配置GDB以支持查看stl容器数据
    TortoiseSVN,排除不想提交文件的方法
    win7系统 设置宽带连接网络共享 出现错误 无法启用共享访问 错误代码:0x80004005:未指定错误
  • 原文地址:https://www.cnblogs.com/black-mamba/p/6754493.html
Copyright © 2011-2022 走看看