使用"模板"编写C或C++库

6

(1). 在使用C++模板时,编译器(例如g++)是否正确地不直接编译模板定义(只能在头文件中而不是源文件中),而是为其每个实例化生成基于模板定义的代码,然后编译所生成的代码?

(2)如果我想编写一个提供模板类和模板函数的C++库,那么将库编译成共享文件(.so、.a)是不可能的,因为它们的实例化不会出现在库的代码中,而只会出现在用户的程序中。如果是这样,那么模板库只是源代码文件而不是预编译文件吗?

C++标准模板库(STL)是如何实现的?它的源代码是预编译还是与用户程序一起编译?

(3). 在C语言中,如何编写一个提供像C++模板函数一样的函数库?重载是一个好的解决方案吗?

如果我必须为不同类型的参数编写不同的函数,是否有一种很好的代码重用方法?这样做http://www.vlfeat.org/api/imop_8c_source.html是一个好的方法吗?还有其他方法吗?

谢谢和问候!

2个回答

13
当使用C++模板时,编译器(例如g++)不会编译模板定义。是的,这是一个正确的假设。模板定义是不完整的代码。您需要在编译之前填写模板参数。
如果我想编写一个提供模板类和模板函数的C++库,将库编译为共享文件(.so、.a)是不可能的。你只能编译单个实例化的模板。
C++标准模板库(STL)是如何实现的?它的源代码是预编译的还是与用户程序一起编译的?STL代码的大部分驻留在头文件中,并与您的应用程序一起编译。
在C语言中,如何编写一个提供像C++模板函数一样的函数的库?这是一个好方法吗http://www.vlfeat.org/api/imop_8c_source.html?其他方法有哪些?在重新定义宏后多次包含相同的文件(如您提供的链接中所示)是实现此目的的一种好方法。

1
我真希望我早点看到这个答案。我花了大约两个小时折腾我的编译器,试图弄清楚为什么我的模板库没有被读取以及我一直收到的错误消息是什么意思。现在在阅读了这篇文章之后,我知道了编译器想要表达的意思。 - Zachary Kraus

1
(3)在C语言中,如何编写一个函数库提供像C++中模板函数一样的函数?重载是一个好的解决方案吗?
如果我必须为不同类型的参数编写不同的函数,有没有很好的代码重用方式?这样做是否是一个好的方式 http://www.vlfeat.org/api/imop_8c_source.html?还有其他方法吗?
当我需要编写通用代码时,我使用void *作为基本数据类型。这很好,因为它允许您存储通用指针和“基本”值(例如int)。最近我还必须在64位环境下编译使用此模式的一些代码,这使我意识到了stdint.h数据类型的重要性!
说到在C语言中像模板一样的操作,这并不是一个好主意。当然,这只是我的个人观点,但我认为C的优点是其简单性,这也是C比C ++更少出现错误的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接