我想在宏的帮助下在编译时(不是运行时)访问结构。例如,我有许多命令,它们有自己的十六进制代码和长度的响应。所以我需要通过预处理器通过一个名称访问一个或另一个值。
比如说,该命令被命名为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个。
有可能吗?怎么做? 感谢。
答案 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 您也可以为每个以相同方式定义的命令设置一些参数。