C语言 #ifndef 引起的redefinition of xxx 问题解决
问题如下
多个.c和.h文件
其中cloth.h
分布被hat.h
和paths.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语言都做了一些什么呢?
预处理
编译
汇编
链接
详细讲解可以参考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 问题解决相关推荐
- error redefinition of 'xxx' 问题解决
error redefinition of 'xxx'出现这种问题: 1. .H文件没有进行#ifndef... #define... ..... #endif 这种限制.
- org.apache.http.client.CircularRedirectException: Circular redirect to http://xxx问题解决
org.apache.http.client.CircularRedirectException: Circular redirect to "http://xxx"问题解决 用H ...
- Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总
Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总 参考文章: (1)Intellij IDEA Cannot resolve symbol XXX 问题 ...
- [ Android实战 ] java.lang.UnsatisfiedLinkError: No implementation found for xxx 问题解决
[ Android实战 ] java.lang.UnsatisfiedLinkError: No implementation found for xxx 问题解决 背景 日志分析 解决问题 总结 尊 ...
- 转: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日 ...
- error: redefinition of ‘xxx’问题的解决
写点基础的东西. C语言初学者一般会遇到重复定义的问题,比如: message.h:36:16: error: redefinition of 'struct MSG_SERVOCTRL' messa ...
- R语言-解决问题:程辑包‘xxx’是用R版本3.3.4 来建造的
用R的时候会碰到这种情形: warning :程辑包'xxx'是用R版本3.3.4 来建造的 尽管R这样提示,但是不影响这个包的使用.因此是可以继续用的,只是它会有这样的提示而已. 出现这种警告的原因 ...
- 【嗜血GO笔记】GO语言:imported and not used: xxx 报错
GO 语言有个特点,你引入的包 必须要 用,如果不用,那么你引入的包将当做异常报错. 解决方案,我不多说,大家也知道,就是把你引入的包用一下即可. 其实异常说的很清楚:imported and not ...
- [问题解决]基于注解配置dubbo遇到ConnectionLoss for /dubbo/xxx问题解决
今天升级spring版本的时候,同时升级dubbo的版本,采用的是dubbo的基于注解的配置方法,采用curator作为dubbo的客户端, curator版本为4.1.0,启动之后,发现一直报错 C ...
最新文章
- Gym迎来首个完整环境文档,强化学习入门更加简单!
- Tornado 学习笔记
- 使用Json.NET来序列化所需的数据
- SQL SERVER 存储过程执行带输出参数的SQL语句拼接
- 什么是DNS,A记录,子域名,CNAME别名,MX记录,TXT记录,SRV 记录,TTL值
- Facebook利用Home平台加速进军移动领域
- linux中文件的合并、归档、和压缩
- 讨论用户注册有的几篇好文
- Netty工作笔记0030---NIO与零拷贝原理剖析
- 什么是CloudComputing
- Java并发编程:Lock(上)
- java WebSocket客户端断线重连 | 实用代码框架
- 北大医学英语和计算机,医学英语专业本科生张泉同学在SSCI期刊发表论文
- 计算机里面的wps如何删除,如何快速删除电脑上的wps的所有换行符
- 苦橙花---不喧哗,自有声
- Java匿名类习题_输出英文字母表和希腊字母表
- kali wifi不可用_Kali Linux系统解决无线网卡无法连接WIFI模块教程:
- bash shell实现并发多进程操作
- Windows下PHPStudy服务环境80端口被进程System占用的解决方法
- 【pytorch】optimizer(优化器)的使用详解
热门文章
- oracle 11g完全安装教程(CentOS)
- servlet对mysql数据库的数据增删改
- NSThread 多线程相关
- sum_series() 求一列数的指定个数的数和(5个数字的和)
- 计算机网络实验五,计算机网络(实验五).docx
- php函数的默认值,php函数指定默认值方法的小例子
- PHP分布式链路追踪,SkyWalking:分布式架构链路追踪-SkyWalking介绍
- java 密钥工厂 desede_20145212 实验五《Java网络编程》
- ip设置 kali 重置_在 Windows 系统中如何重置 TCP/IP 协议堆栈修复网络连接问题
- 如何从stackoverflow的api 中获取是数据_教你拼多多如何选款、测款,打造出爆款。...