中重定义的方法详情介绍,C潜规则篇之防止重定

作者: 计算机网络  发布:2019-11-09

解决C++中重定义的诀要详细的情况介绍,详细情形

C++由于头文件再次满含了所定义的变量可能常量,编译器就能报重复定义的大错特错。借使您碰见那样的题目能够虚构重下边多少个地点去搞定:

1、在产出重定义错误的头文件加上:

#ifndef FileName_H_

#define FileName_H_

....(头文件内容)

#endif

静心借使FileName_H_这几个名字曾经被采用,将会情不自禁未定义难题(这里不探究),这是你作保FileName_H_唯意气风发就足以。

2、在现身重定义错误的丰裕这一句:#pragma once 就足以减轻(VS创建的类都会暗许增多那大器晚成行),方式2与1实际上是平等的,二选后生可畏就能够(个人推举使用格局1)

行使方法1或艺术2许多能够缓慢解决95%以上的再度定义的主题素材。在支付进度中,平常会选择第三方的API,单独选用某一个API都例行,可是还要利用多个API的时候就能并发一些结构体重复定义的标题,当时得以根据下边三种方法处理:

3、将再一次定义的struct、变量名、常量,建议到叁个公家的.h文件中,然后将原工件中中原人民共和国有部分的struct、变量名、常量屏蔽或删除,同不时候在头文件中隐含公共的.h文件。

4、假诺三防库中,现身C风格、C++风格二种不一致的struct定义格局,就不可能依据3的法门缓和了(方式3驱除后编写翻译平常,但是会并发链接难题,解析lib中的导出函数中参数与C风格参数差距)。那时候只要求将C风格方式的struct校勘为C++风格的struct,同时更新API头文件中对应接纳C风格struct地点。

C++由于头文件再度包涵了所定义的变量或然常量,编写翻译器就能报重复定义的错误。若是您碰见如此的...

C程序编写翻译时常出现就好像xxx redefinition错误,除了模块间的命名冲突(命名污染及static),问题比相当多与头文件管理有关。大型C工程的头文件管理很麻烦:C源文件一再蕴藏众六头文件,头文件又包含别的头文件,产生复杂的嵌套富含;C未有严谨约束源文件和头文件的效果边界,二者都能够包罗全局变量和函数等实体定义。那都或许以致品种或实体定义被另行包含和扩充,使编写翻译器抛出重定义错误。

寸草不留重定义难点分三部分,多数人只知其所而不知其二和其三:

以此,用标准化编写翻译(头文件卫士)幸免头文件再次富含

假如源文件test.c中蕴藏a.h和b.h五个头文件,而a.h和b.h里又都包括另八个头文件x.h(很广阔卡塔尔,那么x.h就能够被test.c两遍include,假使x.h里定义了某结构体,如:

typedef struct

{

……

}TEST

预管理(见C编写翻译进度卡塔尔后,test.c里包含八个struct TEST定义,编写翻译器就能够报重定义错误。三个神奇办法是沿用下边头文件模板(俗称头文件卫士卡塔尔:

#ifndef _HDRNAME_H //_HDRNAME_H按头文件的文本名命名,防止同名冲突

#define _HDRNAME_H

…… (content of header file)

#endif

迎面文件首先次被含有,_HDRNAME_H还未define,#ifndef条件满足,预微机步向#ifndef和#endif之间,_HDRNAME_H被正式define,头文件内容也得随地理。当再次被含有,由于_HDRNAME_H已定义,开头的#ifndef不再满意,头文件内容被直接忽视。那样防守因头文件再一次包蕴引起的项目重定义错误。这种做法基本算是C的风花雪夜标准了。

其二,在C源文件里定义全局变量与函数,不要在头文件里定义

#ifndef能防卫头文件再度富含招致的编写翻译阶段类型重定义错误,却无计可施理防线护头文件中的全局变量和函数定义招致的链接阶段实体重定义错误。比如:

/************main.c************/

#include "test.h"

void main()

{

test1();

test2();

}

/********** test.h**********/

#ifndef _TEST_H_

#define _TEST_H_

char str1[] = "char1";

char str2[] = "char2";

#endif

/*********test1.c***********/

#include "test.h"

extern char str1[];

void test1()

{

printf(str1);

}

/*********test2.c************/

#include "test.h"

extern char str2[];

void test2()

{

printf(str2);

}

地方意况,有些编写翻译器报warn,某个或者现身str1和str2重定义error,概念不清的人大概会问:test.h已用#ifndef幸免重包括,为啥还应该有重定义?

那实际上是另三个标题,错误根源在于test.h里含有变量/函数等占用内部存款和储蓄器的实体成分,而不光是define/struct/union等虚类型。就算用#ifndef幸免test.h重复蕴涵,但注意test1.c和test2.c中都包蕴test.h,预微处理器会把test.h分别附到八个源文件起首,也正是在test1.c和test2.c中再次定义了str1,str2四个全局变量。编译完带头link时,linker会发掘test1.obj和test2.obj中都有str1,str2多个标记,于是报错,那跟C命名冲突是千篇大器晚成律景观。

消除办法是在.c文件中定义全局变量,然后建一个暗含全部全局变量extern表明的头文件,其余具有应用这一个变量的.c文件中都要含有那几个头文件。如下:

/*****main.c*****/

#include "test.h"

char str1[] = "char1";

char str2[] = "char2";

void main()

{

test1();

test2();

}

/***** test.h*****/

#ifndef _TEST_H_

#define _TEST_H_

extern char str1[];

extern char str2[];

#endif

/*****test1.c*****/

#include "test.h"

void test1() { printf(str1); }

/*****test2.c*****/

#include "test.h"

void test2() { printf(str2); }

在头文件中定义函数,错误现象和原因相似。因而头文件中能够分包类型定义和实业注解,不应该包含实体定义。别的,不常疏漏typedef也会促成相像重定义难点:

typedef struct{

….

}TEST_S;

万黄金年代脱漏struct前的typedef,TEST_S就产生无名结构体变量实际不是原来的自定义类型,放在头文件里也会出错。

其三,用wrapper合理运用成效域

不常源文件要同时含有八个有同名定义的系统或SDK头文件,就好像一时间包含的几个第三方库的API里有同名的自定义类型,也会导致错误。因为相通不低价改良第三方SDK头文件,为焚林而猎冲突,可考虑对里面叁个库用wrapper情势封装。也正是程序猿自身在多个单独.c文件中封装大器晚成套全新API,那套API间接调用封装对象lib里的函数并逐项对应。这样原lib对应的.h只在wrapper.c文件里带有,而对外API的新.h文件中就足以去掉和其余系统相冲突的定义。

redefinition错误,除了模块间的命名冲突(命名污染及static),难点繁多与头文件管理有关。大型C工程的头文件管理很...

本文由今晚开什么码发布于计算机网络,转载请注明出处:中重定义的方法详情介绍,C潜规则篇之防止重定

关键词: