定义此图形数据 struct 的好方法是什么:

typedef struct
{
    unsigned short isExists : 1;
    WEIGHT_TYPE weight;
} Weight;

typedef struct
{
    Weight adjacencyMatrix[VERTICES_NUM][VERTICES_NUM];
    VERTEX_TYPE vertices[VERTICES_NUM];
} Graph;

是否使用在编译时定义的值VERTICES_NUM

我正在寻找一个比在包括包含以上内容的.h文件之前定义VERTICES_NUM更好的解决方案,并且我不想使用动态分配.

推荐答案

我会首先用一个宏来处理这个问题,它将为您定义类型.

#define DEFINE_GRAPH(NAME, WEIGHT_TYPE, VERTEX_TYPE, VERTICES_NUM) \
        DEFINE_WEIGHT_TYPE(NAME, WEIGHT_TYPE); \
        DEFINE_GRAPH_TYPE(NAME, VERTEX_TYPE, VERTICES_NUM)

#define DEFINE_WEIGHT_TYPE(NAME, WEIGHT_TYPE) \
        typedef struct { \
            unsigned short isExists : 1; \
            WEIGHT_TYPE weight; \
        } WEIGHT(NAME)

#define DEFINE_GRAPH_TYPE(NAME, VERTEX_TYPE, VERTICES_NUM) \
        typedef struct { \
            WEIGHT(NAME) adjacencyMatrix[VERTICES_NUM][VERTICES_NUM]; \
            VERTEX_TYPE vertices[VERTICES_NUM]; \
        } GRAPH(NAME)

#define WEIGHT(NAME) NAME ## _Weight
#define GRAPH(NAME) NAME ## _Graph

现在,用户可以做如下操作:

DEFINE_GRAPH(Test, char, float, 10);

在他们的代码中,他们会使用这样的数据 struct :

int main () {
    GRAPH(Test) g;
    /* ... */
}

C++相关问答推荐

CC crate 示例不会与C函数链接

Apple Libm的罪恶功能

Ebpf内核代码:permission denied:invalid access to map value

C:二进制搜索和二进制插入

在C中将通用字符名称转换为UTF-8

在一个小型玩具项目中实现终端历史记录功能

不会停在空格或换行符上的错误

使用C时,Windows CMD中的argc参数是否包含重定向命令?

将 struct 传递给函数

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

C整型和_泛型.哪些类型是兼容的?

For循环不会迭代所有字符串字符吗?(初学者问题)

STM32 FATFS用户手册(Um1721)中的代码正确吗?

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

存储和访问指向 struct 的指针数组

如何解释数组中的*(ptr)和*(ptr+2)?

x86-64平台上的int_fast8_t大小与int_fast16_t大小

malloc 属性不带参数

Makefile - 将 .o 文件放入子文件夹中

用于内存布局的size命令(文本、数据、bss)