【问题标题】:C typedef struct uncertaintyC typedef struct 不确定性
【发布时间】:2011-01-12 10:50:17
【问题描述】:

考虑 C 中的以下 typedef 结构:

21:typedef struct source{
22: double  ds;             //ray step
23: double  rx,zx;          //source coords
24: double  rbox1, rbox2;   //the box that limits the range of the rays
25: double  freqx;          //source frequency
26:    int64_t  nThetas;        //number of launching angles
27:    double   theta1, thetaN; //first and last launching angle
28:}source_t;

我得到了错误:
globals.h:21:错误:重新定义“结构源”
globals.h:28:错误:“source_t”的类型冲突
globals.h:28: 注意:'source_t' 的先前声明在这里

我已经尝试使用其他格式来定义这个:


struct source{
...
};
typedef struct source source_t;


typedef struct{
...
}source_t;

两者都返回相同的错误。 为什么会这样?对我来说它看起来完全正确。

【问题讨论】:

  • 看起来“globals.h”文件从源文件中包含了两次
  • 非常适合我:ideone.com/kKj8q
  • 基于 SirDarius 的评论:您是否在 globals.h 中设置了 重新包含保护

标签: c struct typedef


【解决方案1】:

你确定你没有包含你的标题两次(没有使用#ifndef/#pragma once 来避免这种情况)? 即使您的构造中有一些错误,它也不应该触发错误“重新定义'...'”,因为它是第一行?

【讨论】:

  • 是的,包含一个包含 globals.h 的文件 [包含一个文件(重复几次)]。使用#pragma once 并创造了奇迹。 Way 更清洁,写作包括警卫。谢谢!
  • 请同时使用 - #pragmas 是特定于编译器的。
【解决方案2】:

最可能的原因是您的头文件被多次包含。 您需要确保如果发生这种情况,typedef 只执行一次。

您可以通过将 globals.h 包装为:

  #ifndef _globals_h_
  #define _globals_h_
  [...]
  #endif

【讨论】:

  • 请不要以下划线开头包含符号名称。此类名称保留供标准库实现使用。 (有一些例外,但最好不要玩火。)对所有输入预处理器的内容使用全大写也是正常的,所以GLOBALS_H 很好。
【解决方案3】:

错误表明struct source 已被多次定义。

也许你包含了两次头文件?

为了安全起见,请确保您的标题只包含一次:放置

#ifndef YOUR_HEADER_FILE_NAME
#define YOUR_HEADER_FILE_NAME

在开头,并且

#endif

在头文件的末尾:这将防止它被任何源文件包含两次或更多次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多