Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从一个C X宏生成多个列表_C_Macros_X Macros - Fatal编程技术网

从一个C X宏生成多个列表

从一个C X宏生成多个列表,c,macros,x-macros,C,Macros,X Macros,我有一个命令枚举列表,可以是请求类型,也可以是响应类型 typedef enum { ENUM1, ENUM2, ... } command_t; 我计划使用X宏生成其枚举,以及名称字符串映射表,如下所示: // commmands.def X(ENUM1), X(ENUM2), // main.h #define X(ENUMVAL, ...) ENUMVAL typedef enum { #include "commands.def" } myenu

我有一个命令枚举列表,可以是请求类型,也可以是响应类型

typedef enum {
     ENUM1,
     ENUM2,
     ...
} command_t;
我计划使用X宏生成其枚举,以及名称字符串映射表,如下所示:

// commmands.def
X(ENUM1),
X(ENUM2),

// main.h
#define X(ENUMVAL, ...) ENUMVAL
typedef enum {
    #include "commands.def"
} myenum_e;
#undef X

#define X(ENUMVAL, NAME) {.name = NAME, .val = ENUMVAL}
name_val_map_t name_val_map_table = {
    #include "commands.def"
} mytable_t;
#undef
此外,我还需要生成两个子列表,即req_列表和rsp_列表。 有没有办法只保留一个commands.def文件并实现这一点? 我试着做了以下几行:

// commmands.def   
// NAME, REQ, RSP
X(ENUM1, 1, 0),
X(ENUM2, 0, 1),

// main.h
#define IF(cond, foo) IF_IMPL(cond, foo)
#define IF_IMPL(cond, foo) IF_ ## cond (foo)
#define IF_0(foo)
#define IF_1(foo) foo

#define X(ENUMVAL, REQ, RSP) IFCOND(REQ, case: ENUMVAL)
void _is_req(myenum_e command) {
    switch(command) {
    #include commands.def
        return 1;
    default: return 0;
    }
}
#undef X

#define X(ENUMVAL, REQ, RSP) IFCOND(RSP, case: ENUMVAL)
void _is_rsp(myenum_e command) {
    switch(command) {
    #include commands.def
        return 1;
    default: return 0;
    }
}
#undef X

这样的事情可能吗?提前谢谢

您需要将冒号放在
IFCOND(RSP,case ENUMVAL:)
中的ENUMVAL之后,但这只是琐事。在
#include
行中,您还需要在
command.def
周围加上双引号-同样是琐事。请注意,一般情况下,您不应创建以下划线开头的函数、变量、标记或宏名。部分说明:-所有以下划线和大写字母或另一个下划线开头的标识符始终保留供任何使用。-所有以下划线开头的标识符始终保留为在普通和标记名称空间中用作具有文件范围的标识符。另请参见创建枚举名称完整列表的数组,并添加指示请求或响应的单列(如果没有同时为请求和响应的命令),然后编写返回命令类型的函数-。您可以使用
bool is_req(myenum_e cmd){return cmd_type(cmd)==1;}
(或者
0
,如果逻辑是那样的话)。
开关
语句实际上并不可取。您的函数不能返回
void
并包含
返回0
返回。1;(更多琐事)。在试验宏时,请查看预处理的源代码以检查效果。我知道的每个编译器(系统)都可以输出预处理的源代码,例如带有选项
-E
的GCC。