gpt4 book ai didi

c++ - 自动将类定义与声明分开?

转载 作者:太空狗 更新时间:2023-10-29 20:49:23 29 4
gpt4 key购买 nike

我使用的库几乎完全由头文件中的模板化类和函数组成,如下所示:

// foo.h
template<class T>
class Foo {
Foo(){}
void computeXYZ() { /* heavy code */ }
};
template<class T>
void processFoo(const Foo<T>& foo) { /* more heavy code */ }

现在这很糟糕,因为每当我包含其中一个头文件(实际上我在每个编译单元中都包含许多头文件)时,编译时间是无法忍受的

因为作为模板参数,我只使用一种或两种类型,无论如何我计划为每个库头文件创建一个只包含声明的文件,没有繁重的代码,如下所示:

// NEW: fwd-foo.h
template<class T>
class Foo {
Foo();
void computeXYZ();
};
template<class T>
void processFoo(const Foo<T>& foo);

然后是创建我需要的所有实例的一个文件。该文件可以一劳永逸地单独编译:

// NEW: foo.cpp
#include "foo.h"
template class Foo<int>;
template class Foo<double>;
template void processFoo(const Foo<int>& foo);
template void processFoo(const Foo<double>& foo);

现在我可以在我的代码中包含 fwd-foo.h 并且编译时间很短。我将在最后链接到 foo.o

当然,缺点是我必须自己创建这些新的 fwd-foo.hfoo.cpp 文件。当然,这是一个维护问题:当发布新的库版本时,我必须使它们适应新版本。还有其他缺点吗?

我的主要问题是:

我是否有机会从原始 foo.h 创建这些新文件,尤其是 fwd-foo.h自动?我必须为许多库头文件(可能 20 个左右)执行此操作,自动解决方案是最好的,尤其是在发布新库版本并且我必须对新版本再次执行此操作的情况下。是否有任何工具可用于此任务?

编辑:

附加问题:在这种情况下,新支持的 extern 关键字如何帮助我?

最佳答案

我们使用 lzz它将单个文件拆分为单独的标题和翻译单元。默认情况下,它通常也会将模板定义放入 header 中,但是,您可以指定不希望这种情况发生。

为了向您展示如何使用它,请考虑以下内容:

// t.cc
#include "b.h"
#include "c.h"

template <typename T>
class A {
void foo () {
C c;
c.foo ();
b.foo ();
}
B b;
}

将上面的文件复制到“t.lzz”文件中。根据需要将任何 #include 指令放入单独的 $hdr 和 $src block 中:

// t.lzz
$hdr
#include "b.h"
$end

$src
#include "c.h"
$end

template <typename T>
class A {
void foo () {
C c;
c.foo ();
b.foo ();
}
B b;
}

现在最后,对文件运行 lzz,指定它将模板定义放入源文件中。您可以使用源文件中的 $pragma 执行此操作,也可以使用命令行选项“-ts”:

这将导致生成以下文件:

// t.h
//

#ifndef LZZ_t_h
#define LZZ_t_h
#include "b.h"
#undef LZZ_INLINE
#ifdef LZZ_ENABLE_INLINE
#define LZZ_INLINE inline
#else
#define LZZ_INLINE
#endif
template <typename T>
class A
{
void foo ();
B b;
};
#undef LZZ_INLINE
#endif

和:

// t.cpp
//

#include "t.h"
#include "c.h"
#define LZZ_INLINE inline
template <typename T>
void A <T>::foo ()
{
C c;
c.foo ();
b.foo ();
}
#undef LZZ_INLINE

然后您可以通过一些 grep/sed 命令运行它们以删除 LZZ 辅助宏。

关于c++ - 自动将类定义与声明分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/652779/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com