C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 标题中的枚举导致过多的重新编译大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我面临的问题是编译了太多文件,因为单个枚举存在物理依赖性.

我有一个包含枚举定义的标题

// version.h
enum Version {
    v1 = 1,v2,v3,v4,v5,... v100
};

这被数百个文件使用.
每个文件定义一个对象类,必须从磁盘中读取,
使用read()函数.版本用于确定数据的读取方式.

每次引入新的类或类成员时,都会在枚举中附加一个新条目

// typeA.cpp
#include "version.h"

void read (FILE *f,ObjectA *p,Version v) 
{
    read_float(f,&p->X);
    read_float(f,&p->y);
    if (v >= v100) { 
        read_float(f,&p->z);  // after v100 ObjectA becomes a 3D
    }
}

// typeB.cpp
#include "version.h"

void read (FILE *f,ObjectB *p,Version v)
{
    read_float (f,&p->mass);
    if (v >= v30) {
        read_float (f,&p->veLocity);
    }
    if (v >= v50) {
        read_color (f,&p->color);
    }
}

现在,正如您所看到的,一旦ObjectA发生变化,我们就必须向版本引入一个新条目(比如说v100).因此,所有类型* .cpp文件都将被编译,即使只有ObjectA的read()确实需要v100条目.

如何在对客户端(即类型* .cpp)代码进行最小更改的情况下反转对枚举的依赖性,以便只编译必要的.c文件

这是一个可能的解决方案,我想到了,但我需要一个更好的解决方案:

我想我可以将枚举放在.cpp文件中,并使用各个枚举成员的值公开int:

//version.cpp
enum eVersion {
    ev1 = 1,ev2,ev3,ev4,ev5,... ev100
};

const int v1 = ev1;
const int v2 = ev2;
....
const int v100 = ev100;   // introduce a new global int for every new entry in the enum

以某种方式为版本类型创建别名

//version.h
typedef const int version;

并且仅引入每次所需的const int值:

// typeA.cpp
#include "version.h"

extern Version v100;    ///// *** will be resolved at link time

void read (FILE *f,&p->z);  // after v100 ObjectA becomes a 3D
    }
}

但我认为这看起来非常糟糕,可以追溯到前标题时间

解决方法

我不确定你的版本控制系统.你不能将对象定义与阅读分离吗?

// ObjectA.cpp

#include"ObjectA.h"  

// define ObjectA

void ObjectA::setPar ( float xx,float yy,float zz) 
{
    x = v[0];
    y = v[1];
    z = v[2]; 
}

然后

// typeB.cpp

#include"ObjectB.h"  

// define ObjectB

void ObjectB::setPar ( float mm,float vv,color cC) 
{
    mass = mm;
    veLocity = vv;
    color = cc; 
}

然后在一个(大)文件

// readObject.cpp

#include"version.h"
#include"ObjectA.h"
#include"ObjectB.h"

void read (FILE *f,Version v) 
{
    float x,y,z;
    read_float(f,X);
    read_float(f,y);
    if (v >= v100) { 
        read_float(f,z);  // after v100 ObjectA becomes a 3D
    } else z=0.0;          // whatever
    p->setPar(x,z);
}

void read (FILE *f,Version v)
{
    ...
}

大佬总结

以上是大佬教程为你收集整理的c – 标题中的枚举导致过多的重新编译全部内容,希望文章能够帮你解决c – 标题中的枚举导致过多的重新编译所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。