Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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++?< /p>_C++_C++11_Language Lawyer_Dynamic Loading - Fatal编程技术网

动态加载是否与C+严格兼容+;标准 < >动态加载的使用是否需要对代码进行严格的法律防范C++?< /p>

动态加载是否与C+严格兼容+;标准 < >动态加载的使用是否需要对代码进行严格的法律防范C++?< /p>,c++,c++11,language-lawyer,dynamic-loading,C++,C++11,Language Lawyer,Dynamic Loading,C++11标准是指某些事件的顺序,例如在第一次调用main()之前发生的事件。然而,在关于程序中事件顺序的典型假设下,动态加载似乎会把地毯拉出来 例如,引用§3.6.2 静态初始化应在任何动态初始化发生之前进行 在动态荷载的情况下,如果按字面理解,这似乎是一项几乎不可能的义务。程序可能会进行动态初始化,然后动态加载代码。如果该代码包含通常静态初始化的变量,则违反了C++标准。似乎标准所规定的事件的顺序仍然可以被“满意”的规则所满足,并且是合法的,但在其他地方,其他人已经警告过解释太宽的规则。 <

C++11标准是指某些事件的顺序,例如在第一次调用main()之前发生的事件。然而,在关于程序中事件顺序的典型假设下,动态加载似乎会把地毯拉出来

例如,引用§3.6.2

静态初始化应在任何动态初始化发生之前进行


在动态荷载的情况下,如果按字面理解,这似乎是一项几乎不可能的义务。程序可能会进行动态初始化,然后动态加载代码。如果该代码包含通常静态初始化的变量,则违反了C++标准。似乎标准所规定的事件的顺序仍然可以被“满意”的规则所满足,并且是合法的,但在其他地方,其他人已经警告过解释太宽的规则。

< P> C++标准没有对动态模块的任何规定,所以一定的解释是必要的。 是的,动态加载模块中的静态初始化变量将在主模块中的动态初始化变量之后初始化。您可以观察到这一点,并构建对程序行为有影响的程序。但是,如果您将DLL视为一个单独的程序,一个共享主程序内存空间但有自己时间线的程序,那么您几乎可以在模块级别应用相同的规则,并使用它们预测应用程序范围内的行为。编译器不想让你惊讶。。。只是有时候需要


顺便说一下,在C++和DLL之间的冲突中,初始化顺序是最不关心的。动态模块打破的规则远不止这些,尤其是在RTTI方面

一个正确的程序怎么可能在尚未加载的代码中观察到变量的初始化状态呢?这就是为什么我提到“好像”规则的原因。不过,我并不是“似乎”规则所有含义的专家。也许还有其他关于动态载荷的情况。实际上没有任何回旋余地来大致解释“好像”规则,这与其他地方可能提出的相反。静态初始化期间不会发生可观察的事件,因此对象在第一次使用之前的任何时间都可能实际进行静态初始化。静态初始化的元素在动态加载发生之前不存在。因此,从原始程序的角度来看,它不是静态初始化的。一旦动态加载开始,模块[1]的静态初始化将在模块的动态初始化之前发生,并且实际使用该模块的主程序只有在。。。[1不,标准没有提到模块,但由于在加载模块之前,模块外部没有可见的内容,因此我们实际上或多或少可以将其视为一个独立的可执行文件]。相关:我非常喜欢这种对“程序”的巧妙解释。我认为C++标准称一个“程序”必须定义一个主()函数会证明它是错误的,但在动态负载的情况下,共享LIBS完全可以定义一个哑主体()。@ PrxeOLITy或者,作为一个很难对付的语言律师,可以说DLL是作为独立的实现编译的。因此不需要
main()
@Sneftel:我认为DLL是独立实现的主要用例之一,特别是在允许程序链接到平台提供的C库版本的非Unix环境中,虽然C和C++标准的某些特征可能不支持所有这样的环境。