2015-01-01 20 views
-1

我想知道如何在c语言中使用多个.h文件时需要执行typedef。我有一个项目要做,并决定将功能分成两个独立的.c和.h文件,以便更容易地定位某个功能。但我遇到的问题是我需要使用typedef定义两个类型,并且这两个头文件都需要知道这个类型是什么,否则我会得到类型未知或类似的错误。我曾尝试将typedef放在单独的.h文件中。在使用多个.h文件时在哪里做typedef

//in type.h 
typedef struct 
{ 
    int val; /*Valeur de la case (0 si vide)*/ 
    int n_candidats; /*Nombre de candidats possibles*/ 
    int candidats[9]; /*liste de candidats*/ 
} T_case; 

typedef struct 
{ 
    T_case grille[81]; /*vecteur de 81 cases*/ 
} T_sudoku; 

但是,当我有它在我的其他.h文件将无法正常工作,它像,T_case以前这里定义,冲突的类型..,注意到错误的负载出现:预计“T_sudoku '但是论点是'T_sudoku'类型的。

回答

2

该问题可能是由将.h文件包含在多个.c文件中引起的。 (在.c文件前,在另一头,再) 尝试使.h文件这样

#ifndef FILENAME_H 
#define FILENAME_H 

/// put all the definitions of the .h file here 
#endif 
+0

好的,谢谢,我是否对所有的.h文件或只使用typedef的文件执行此操作? – Ty1607

+0

1)对原始问题的回答:将“typedef”放在任何标题中(例如“a.h”)。然后#将它包含在另一个头文件中(例如“b.h”)。 2)“#ifndef FILENAME_H”的答案 - 您应该*始终*使用此惯例,在* all *您的头文件中。 PS:他们被称为“包括卫兵”。你可以在这里阅读更多关于它们的信息(http://en.wikipedia.org/wiki/Include_guard)。 – FoggyDay

+0

这是一个很好的做法,用于所有头文件。因为它阻止了相同变量的多重定义。 –

1

的问题是,你包括type.h多次。因此,有多个typedef。

要解决此问题,请使用头文件顶部的include guard#pragma once

+0

[“#pragma once”](http://en.wikipedia.org/wiki/Pragma_once)与[“include guard”](http://en.wikipedia.org/wiki/Include_guard)不兼容。我建议避免#pragma一次:https://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC8 – FoggyDay

+0

@FoggyDay:它没有说明它为什么过时。我发现它比常规护卫更实用更安全。 – bitmask

+0

@FoggyDay我改变了文字。不过,我发现#pragma曾经是更好的选择。实施起来要简单得多,并且避免了诸如偶然同名两次的问题。 –

相关问题