Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 由预处理器/模板从不同模块生成列表/集合,链接前必须填写_C++_Templates_C Preprocessor - Fatal编程技术网

C++ 由预处理器/模板从不同模块生成列表/集合,链接前必须填写

C++ 由预处理器/模板从不同模块生成列表/集合,链接前必须填写,c++,templates,c-preprocessor,C++,Templates,C Preprocessor,我有一些全局变量(类),据我所知,它们是在调用main()call之前创建的。我需要一些技术将数据从我的代码的任何部分添加到全局或该类成员的列表中,并且必须在链接器之前填充。在全局创建的类中使用它。可能吗?我没有找到任何类似的解决方案,甚至没有问题,因此,任何帮助都将不胜感激 详细示例: 我有一个singleton类,它有一个在构造函数中填充的变量。所有其他类在运行时使用该类中的数据—有人在早期,有人在稍后。Singleton类是在main函数的开头创建的。我在不同的项目中使用singleton

我有一些全局变量(类),据我所知,它们是在调用
main()
call之前创建的。我需要一些技术将数据从我的代码的任何部分添加到全局或该类成员的列表中,并且必须在链接器之前填充。在全局创建的类中使用它。可能吗?我没有找到任何类似的解决方案,甚至没有问题,因此,任何帮助都将不胜感激

详细示例:

我有一个singleton类,它有一个在构造函数中填充的变量。所有其他类在运行时使用该类中的数据—有人在早期,有人在稍后。Singleton类是在main函数的开头创建的。我在不同的项目中使用singleton,它的数据对于所有的项目和模块来说都是通用的,除了应该显示对这个模块需求的特殊标志。如果singleton抛出异常程序退出,并且我们在执行的第一步就知道它,因为singleton在main的第一行创建异常。所以对于所有项目,singleton都有很多通用数据,但我需要为singleton添加标志,指出每个模块需要哪些数据。我已经为main创建了模板,所以对于每个项目,我都有相同的main,只是简单地定义了project_NAME。稍后,我将.cpp添加到项目中,他们必须注册哪些数据是必需的,哪些不是必需的

这个解释看起来并不完美,如果不可理解,请毫不犹豫地说出来,我会更仔细地组织它

编辑:


我仍然在互联网上寻找解决方案,发现constexpr它看起来像我需要的,但目前并非所有编译器都支持它,是否有一些解决方法?

第一步是不使用全局变量,而是在全局函数中使用静态变量。第一次调用函数时,将初始化变量,然后让函数返回对变量的引用

my_class& instnace() {
   static my_class i;
   return i;
}
举个例子:

std::list<my_class>& global_list() { 
   static std::list<my_class> m; return m;
}


static int x = []()->int{ global_list().push_back(my_class); return 0;}();
std::list&global_list(){
静态标准::列表m;返回m;
}
静态int x=[]()->int{global_list()。向后推(my_类);返回0;}();

如果您想从不同的模块中实现所需的功能,其中一种方法是在加载dll时使用某种回调函数来完成

一个窗口是

动态链接库(DLL)的可选入口点。当 系统启动或终止进程或线程,它调用 使用 过程系统还调用DLL的入口点函数 它是使用LoadLibrary和FreeLibrary加载或卸载的 功能

在使用gcc的其他平台上,您可以通过[attribute constructor]获得

构造函数构造函数属性导致调用函数 在执行进入main()之前自动执行。同样地 析构函数属性使函数自动调用 在main()完成或调用exit()之后。功能与 这些属性对于初始化将要使用的数据非常有用 在程序执行期间隐式地。这些属性是 目前未针对目标C实施

警告


用这种方法很容易击中自己的脚。至少在windows上,有很多事情是你在windows中无法完成的。请阅读您的编译器/操作系统文档,了解其局限性。

这听起来像是一个XY问题,同时也带来了很大的困惑。请描述您正试图解决的问题?校长感谢您的有效回复。你能给我更全面的解释一下你的列表例子吗?我不明白我怎么用它。更确切地说,我无法理解静态int x。。。部分谢谢。我找到了关于lambda函数的信息。问题是,如果我在其他类中执行此操作,则在调用构造函数或函数时会添加信息。这意味着原始类已经被创建并正确地传递了所有数据。我不理解你的问题。代替lambda,你可以只定义一个helper函数,这是一个丑陋的例子
first.cpp:void addList1(void){param_list.push_back(“first”)}void a_uuuuuuu1234=1addList()