如何实现加载c ++的动态模块(在头文件中)

Posted

技术标签:

【中文标题】如何实现加载c ++的动态模块(在头文件中)【英文标题】:How to implement dynamic module (in header files) loading c++ 【发布时间】:2014-10-07 17:41:03 【问题描述】:

我想根据定义加载各种头文件(模块、插件)。这是我的方法:

template<typename T = float>
class container 
   T *_data;

 #ifdef mymodule1
 #include mymodule1
 #endif

...

Mymodule1.h:

container<T> fooOnContainer() [maybe const] 
   makesomething involving the T template parameter

并且在包含“main”的文件中:

#define mymodule1 "mymodule1.h"
#include "container.h"
in main  using it 

所以基本上只有定义的头文件会包含在我的容器中。我在名为“cimg”的库中看到了这种方法,但我无法使其工作,因为编译器无法推断出模板参数。如果我做类似的东西很好:

container<T>& fooOnContainer(T param) 
...

但是有没有办法像第一个“mymodule1.h”那样做到这一点?也许与运算符重载?或者如果不可能的话,有人可以建议我一个更好更简单的方法吗? (我真的不明白它是如何为该库工作的:))

编辑:

对不起,如果我是不确定的,所以这里有一些代码:

这是一个毫无意义的例子,但我想做这样的事情,但当然更复杂:

Mymodule1.h:

int getWidth() const 
    return (*this)._width;

智能感知说: " 非成员函数上不允许使用类型限定符 "

另一个例子:

T getPos(int x) const 
    T* px;
    return _data[x];

智能感知说: “T”未定义,标识符“_data”未定义

【问题讨论】:

你好吗 using it 实际上? 您能创建一个Minimal, Complete, and Verifiable example 并展示给我们看吗?还请包括您遇到的所有错误。 例如:容器 img; ...加载图像...容器 dest; dest = image.fooOnContainer([阈值什么的]) 【参考方案1】:

哦,所以你只是从智能感知中得到错误?不是来自实际的编译器?那是因为当你编辑 Mymodule1.h 文件时,编辑器没有所有数据,编辑器不知道代码实际上是更大类的一部分。

解决方案?真的没有,如果你想继续使用这样的头文件。唯一的解决方案是不使用头文件,而是在实际代码周围使用预处理器条件。

【讨论】:

嗯,它似乎只是智能感知,我是个白痴:)(我之前编译错误,但之后我信任智能感知并没有编译它......)我想我会尝试使用预处理器条件来消除我的 .h 文件中的那些错误或类似的东西,谢谢!【参考方案2】:

类似于包含守卫,应该使用#ifndef 而不是#ifdef

...
#ifndef mymodule1
#include mymodule1
#endif
...

这里的问题是编译器将#include "a.h" 替换为 a.h 文件的内容。不管它包含什么。如果当前上下文中的语法是正确的,那么一切都很好。

我已经尝试了您的代码,一切正常。所以请提供有关错误的详细信息。

【讨论】:

我认为 OP 实际上只希望在定义宏 的情况下包含该文件,而不是相反。

以上是关于如何实现加载c ++的动态模块(在头文件中)的主要内容,如果未能解决你的问题,请参考以下文章

c语言中是如何实现模块化的

AngularJS项目中如何实现按需加载js文件?

如何在js文件中动态加载另一个js文件?

在 Elixir 或 Erlang 中,如何在运行时动态创建和加载模块?

如何在 react-native 中动态加载模块?

c语言中如何实现模块化?