问题如下

多个.c和.h文件

其中cloth.h分布被hat.hpaths.h包含,编译时出现如下问题:

error: redefinition of struct _Cloth

我的cloth.h定义如下:

#include <stdio.h>
#include <stdlib.h>
#include "retval.h"struct _Cloth;
typedef struct _Cloth Cloth;typedef Cloth* (*createClothFunc)();
typedef void (*deleteClothFunc)(Cloth* thiz);struct _Cloth
{createClothFunc createCloth;deleteClothFunc deleteCloth;
};

_Cloth 结构体先声明,再定义,显然满足C语言的语法,那麽以上重复定义的异常来自那里呢?

问题解决

紧接着发现该问题是在编译时检测出来的,那麽分析一下编译器在编译C语言都做了一些什么呢?

  1. 预处理

  2. 编译

  3. 汇编

  4. 链接

详细讲解可以参考C语言编译过程

关于#ifndef 条件编译 的作用如下

#ifndef x //先测试x是否被宏定义过
#define xcode 1    //如果x没有被宏定义过,定义x,并编译code 1#endifcode 2    //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。

显然其最主要的目的是为了防止头文件 的重复包含和编译。

到此,以上结构体重定义的问题就比较清晰了,cloth.h被重复包含,且因为cloth.h未指定条件编译,被重复编译了。此时编译器会认为cloth.h中的结构体定义是被重复定义得。

在多文件的开发过程种,需要规范化头文件的定义,增加条件编译相关的代码,防止头文件被重复包含导致的编译 异常。

C语言 #ifndef 引起的redefinition of xxx 问题解决相关推荐

  1. error redefinition of 'xxx' 问题解决

    error redefinition of 'xxx'出现这种问题: 1. .H文件没有进行#ifndef... #define... ..... #endif 这种限制.

  2. org.apache.http.client.CircularRedirectException: Circular redirect to http://xxx问题解决

    org.apache.http.client.CircularRedirectException: Circular redirect to "http://xxx"问题解决 用H ...

  3. Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总

    Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总 参考文章: (1)Intellij IDEA Cannot resolve symbol XXX 问题 ...

  4. [ Android实战 ] java.lang.UnsatisfiedLinkError: No implementation found for xxx 问题解决

    [ Android实战 ] java.lang.UnsatisfiedLinkError: No implementation found for xxx 问题解决 背景 日志分析 解决问题 总结 尊 ...

  5. 转:delphi dpk编译 Error: E2161 RLINK32: Unsupported 16bit resource in file xxx 问题解决

    [问题解决]delphi dpk编译 Error: E2161 RLINK32: Unsupported 16bit resource in file xxx 问题解决 原创 2013年08月27日 ...

  6. error: redefinition of ‘xxx’问题的解决

    写点基础的东西. C语言初学者一般会遇到重复定义的问题,比如: message.h:36:16: error: redefinition of 'struct MSG_SERVOCTRL' messa ...

  7. R语言-解决问题:程辑包‘xxx’是用R版本3.3.4 来建造的

    用R的时候会碰到这种情形: warning :程辑包'xxx'是用R版本3.3.4 来建造的 尽管R这样提示,但是不影响这个包的使用.因此是可以继续用的,只是它会有这样的提示而已. 出现这种警告的原因 ...

  8. 【嗜血GO笔记】GO语言:imported and not used: xxx 报错

    GO 语言有个特点,你引入的包 必须要 用,如果不用,那么你引入的包将当做异常报错. 解决方案,我不多说,大家也知道,就是把你引入的包用一下即可. 其实异常说的很清楚:imported and not ...

  9. [问题解决]基于注解配置dubbo遇到ConnectionLoss for /dubbo/xxx问题解决

    今天升级spring版本的时候,同时升级dubbo的版本,采用的是dubbo的基于注解的配置方法,采用curator作为dubbo的客户端, curator版本为4.1.0,启动之后,发现一直报错 C ...

最新文章

  1. Gym迎来首个完整环境文档,强化学习入门更加简单!
  2. Tornado 学习笔记
  3. 使用Json.NET来序列化所需的数据
  4. SQL SERVER 存储过程执行带输出参数的SQL语句拼接
  5. 什么是DNS,A记录,子域名,CNAME别名,MX记录,TXT记录,SRV 记录,TTL值
  6. Facebook利用Home平台加速进军移动领域
  7. linux中文件的合并、归档、和压缩
  8. 讨论用户注册有的几篇好文
  9. Netty工作笔记0030---NIO与零拷贝原理剖析
  10. 什么是CloudComputing
  11. Java并发编程:Lock(上)
  12. java WebSocket客户端断线重连 | 实用代码框架
  13. 北大医学英语和计算机,医学英语专业本科生张泉同学在SSCI期刊发表论文
  14. 计算机里面的wps如何删除,如何快速删除电脑上的wps的所有换行符
  15. 苦橙花---不喧哗,自有声
  16. Java匿名类习题_输出英文字母表和希腊字母表
  17. kali wifi不可用_Kali Linux系统解决无线网卡无法连接WIFI模块教程:
  18. bash shell实现并发多进程操作
  19. Windows下PHPStudy服务环境80端口被进程System占用的解决方法
  20. 【pytorch】optimizer(优化器)的使用详解

热门文章

  1. oracle 11g完全安装教程(CentOS)
  2. servlet对mysql数据库的数据增删改
  3. NSThread 多线程相关
  4. sum_series() 求一列数的指定个数的数和(5个数字的和)
  5. 计算机网络实验五,计算机网络(实验五).docx
  6. php函数的默认值,php函数指定默认值方法的小例子
  7. PHP分布式链路追踪,SkyWalking:分布式架构链路追踪-SkyWalking介绍
  8. java 密钥工厂 desede_20145212 实验五《Java网络编程》
  9. ip设置 kali 重置_在 Windows 系统中如何重置 TCP/IP 协议堆栈修复网络连接问题
  10. 如何从stackoverflow的api 中获取是数据_教你拼多多如何选款、测款,打造出爆款。...