在编译时有一个结构

时间:2017-03-12 10:36:03

标签: c macros c-preprocessor

我想在宏的帮助下在编译时(不是运行时)访问结构。例如,我有许多命令,它们有自己的十六进制代码和长度的响应。所以我需要通过预处理器通过一个名称访问一个或另一个值。

比如说,该命令被命名为READ_SOMETHING_FROM_THAT_PLACE,它有一个代码0xAB和7个响应字节作为答案。

本研究旨在避免使用两个定义,例如:

#define READ_SOMETHING_FROM_THAT_PLACE_CODE 0xAB
#define READ_SOMETHING_FROM_THAT_PLACE_LEN 7
相反,通过一个实例访问这两个实例会更方便和健壮。我想它可以通过宏来访问,如(种类):

CODE(READ_SOMETHING_FROM_THAT_PLACE)和预处理器会给我0xAB

LEN(READ_SOMETHING_FROM_THAT_PLACE)和预处理器会给我7个。

有可能吗?怎么做? 感谢。

1 个答案:

答案 0 :(得分:1)

创建一个存储命令的结构,有2个字段,1代表代码,另一个代表长度ir返回,然后你可以用它做很多事情,甚至你自己的想法,老实说看起来不像一个好主意,或者至少没有必要。

也许是这样,

display:none;

一个好的方法可能涉及另一个结构,你的命令作为字段,比如

#include <stdio.h>

#define CODE(cmd) (commands[cmd].code)
#define LEN(cmd) (commands[cmd].length)

struct command {
    unsigned char code;
    int length;
};

enum {
    Read = 0
};

static const struct command commands[] = {
    [Read] = {0xAB, 0x07}
};

int
main(void)
{
    fprintf(stdout, "0x%02X, %d\n", CODE(Read), LEN(Read));
    return 0;
}

你现在可以拥有一个功能,

#include <stdio.h>

struct command {
    unsigned char code;
    int length;
};

struct commands {
    struct command read;
    struct command write;
    /* More commands */
};


static const struct commands table = {
    .read = {0xAB, 0x07}
};

int
main(void)
{
    fprintf(stdout, "0x%02X, %d\n", table.read.code, table.read.length);
    return 0;
}

并将其称为 1

unsigned char *execute(const struct command *const cmd);

然后你有一个执行命令的通用界面,你不必担心实际的unsigned char *response = execute(&table.read); 或返回长度,因为你有权访问它们。

1 您也可以为每个以相同方式定义的命令设置一些参数。