【问题标题】:Including header file causes conflicting types包含头文件会导致类型冲突
【发布时间】:2013-12-03 14:29:54
【问题描述】:

所以我在头文件中有这个结构,称为 h1.h

typedef struct{
    int a;
    int b;
    special_t test;
} randomDataType

所以我包含了包含 special_t 声明的头文件。两个头文件中的函数都没有同名,我看不出循环依赖如何发挥作用,因为第二个头文件中声明的函数只能通过 h1.h 中声明的函数访问

然而,对于另一个标题中的所有内容,我都有一个“__ 的先前声明”错误。这是为什么呢?

【问题讨论】:

  • 你没有两次包含任何标题吗?
  • 既然你提到了它,我在主 .c 文件中包含了第二个头文件,没有任何理由......哈哈,这是一个微不足道的错误。

标签: c


【解决方案1】:

听起来您的头文件中没有多个包含保护。除非在极少数情况下您会知道,否则 C 头文件应该这样编写:

/* This is h1.h.
   This is its license.

   This is what you will find here. */

#ifndef H1_H__
#define H1_H__

all declarations go here

#endif /* h1.h */

除了 cmets 之外,#ifndef ... #endif 块之外不应有任何内容,并且您需要选择宏名称,使其不会与任何其他标题冲突 - 假设 所有的 C 头文件中都有这个结构,或者类似的东西。

这个的作用是允许你#include "h1.h"任意次数;编译器只会处理一次它的内容。许多编译器识别这个结构,甚至不会再次打开文件(只要宏仍然被定义)。因此,您可以安全地包含来自其他头文件的头文件(可能只需要一些声明),而不必担心其他文件做了什么。

【讨论】:

  • 我认为这是事实上的方式,但使用 #pragma 曾经是实现相同目标的糟糕方式??
  • 完全可以,它仍然不在标准中,但每个主要编译器都接受它
  • #pragma once 是一个不应该使用的严重错误功能。它使程序的正确性取决于编译器确定上下文 1 中的 #include "a.h" 是否与上下文 2 中的 #include "a.h" 引用同一文件的能力。相比之下,#ifndef技术将其置于程序员控制之下;如果有两个名为"a.h" 的文件不能混淆,则只需确保它们具有不同的保护宏。 (是的,这确实出现在实际代码中。)
猜你喜欢
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多