#include <stdio.h>
#include <stdlib.h>

typedef struct sommet sommet;
typedef struct voisin voisin;
typedef struct graphe graphe;

struct sommet{  
    int indice;
    sommet* next;
    voisin* first_voisin;
};

struct voisin{
    int indice;
    voisin* next_voisin; 
};

struct graphe{
    sommet* premier_sommet;
}; 

下面是一个简单的 struct 定义h程序. 我得到了一个Error:redefinition的 struct . 我该怎么解决这个问题? 谢谢!

我试着直接把

typedef struct sommet {
 //code
};

并且还

typedef struct{
 //code 
}sommet;

推荐答案

您可以通过遵循以下最佳实践来解决重新定义编译时问题,这是非常有信心的.请注意,这个代码代表两个文件--aMyHeaderFile.hmain.c.

MyHeaderFile.h顶部的包含保护MY_HEADER_FILE_H确保 struct 定义(以及包含文件中的任何其他内容)只定义一次,这是关键. 它告诉编译器,"只有在MY_HEADER_FILE_HNOT定义的情况下,才进入超过这个点."这阻止了对接下来的一切进行第二次定义.

除此之外,没有什么可说的了--毕竟这是your码.

可运行代码here.

/* ---------- MyHeaderFile.h ---------- */
#ifndef MY_HEADER_FILE_H
#define MY_HEADER_FILE_H

#include <stdio.h>  /* Pls see Ted Lyngmo's comment on this */
#include <stdlib.h>

typedef struct sommet sommet;
typedef struct voisin voisin;
typedef struct graphe graphe;

struct sommet{  
    int indice;
    sommet* next;
    voisin* first_voisin;
};

struct voisin{
    int indice;
    voisin* next_voisin; 
};

struct graphe{
    sommet* premier_sommet;
};

#endif //MY_HEADER_FILE_H
/* ---------- main.c ---------- */
#include "MyHeaderFile.h"

int main()
{

    voisin v = {5, NULL};

    printf("%d\n", v.indice);
    return 0;
}

输出:

    5

C++相关问答推荐

函数指针始终为零,但在解除引用和调用时有效

ATmega328P USART发送字符重复打印

在#include中使用C宏变量

如何使fputs功能提示错误输入并要求用户重新输入.程序停止而不是请求新的输入

如何计算打印二叉搜索树时每行所需的空间?

For循环中的变量行为不符合预期.[C17]

<;unistd.h>;和<;sys/unistd.h>;之间有什么区别?

为什么Fread()函数会读取内容,然后光标会跳到随机位置?

C代码在字符串中删除不区分大小写的子字符串的问题

添加函数会 destruct 嵌入式C代码(无IDE)

条件跳转或移动取决于未初始化值(S)/未初始化值由堆分配创建(Realloc)

如何在C中定义指向函数的指针并将该指针赋给函数?

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

C: NULL>;NULL总是false?

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

C Makefile - 如何避免重复提及文件名

free后内存泄漏?

C11 嵌套泛型

快速准确计算double的小数指数

我们可以在不违反标准的情况下向标准函数声明添加属性吗?