- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们有一个C++库。它具有四个对初始化顺序敏感的静态对象(其中两个是标准库中的字符串)。
我们正在使用 init_seg(lib)
来控制库中C++静态对象的初始化顺序。正在使用它的源文件被编译并在动态链接库或静态库中使用。根据init_seg
的文档:
... It is particularly important to use the init_seg pragma in dynamic-link libraries (DLLs) or libraries requiring initialization. (emphasis mine)
init_seg
编译源文件将导致
warning C4073,而将文本初始化程序放置在库初始化区域中。根据MSDN:
Only third-party library developers should use the library initialization area, which is specified by #pragma init_seg. The following sample generates C4073...
init_seg
的代码仅在库中使用,而
而不是与测试驱动程序一起使用。我已经验证了静态库和动态库项目设置,并且它们清楚地表明了库工件。
最佳答案
它只是在警告您,甚至没有摇晃手指,更像是“确定吗?”当您使用使用此功能的第三方库时,它也会警告开发人员-除非他使用#pragma warning
将其关闭。您也可以这样做。或者,您可以使用段user
而不是段lib
:在运行应用程序代码之前,仍将构造字符串。 segmentation lib
确实适用于...哦,Qt或MFC或类似的框架,此类框架需要在运行任何应用程序代码之前进行初始化,包括user
中的早期初始化内容。
这是更多信息:
假设您有一个自己的应用程序库。而且它有一些东西需要在其任何代码运行之前进行初始化,因为该库公开的某些类打算在您的应用程序代码中静态分配(或允许被静态分配),而这些类会做一些复杂的事情例如,在他们的构造函数中,需要一些大的预先计算(但不是静态)数据。因此,对于这些预先计算出的内容,您可以在一个类(另一个类)的构造函数中对其进行预先计算,然后静态分配该类的实例,以便该实例的初始化调用其构造函数来预先计算所有这些内容,而该静态实例用pragma init_seg(user)
标记。现在,在您的任何应用程序代码运行之前(包括您代码中该库类的静态实例的任何构造函数),该库的init_seg(user)
代码将全部运行,因此,当您对该库类的静态实例进行构造时,它们需要将在那里。
现在考虑确实必须提早解决的问题,您可以调用其中的静态实例。例如std::cout
。您可以在自己具有静态实例的类的构造函数中在std::cout
上调用方法。显然,对象std::cout
需要在运行任何代码之前进行初始化。而且您的某些代码可能会在您标记为init_seg(user)
的内容中运行。因此,Microsoft将所有此类代码(即std::cout
等的构造函数)放置在init_seg(compiler)
中。这些东西将首先运行。
那么init_seg(lib)
的作用是什么?好吧,假设您是像MFC这样的框架。您公开了诸如Application对象之类的东西,用户将(可能希望)创建一个静态实例。 Application中将在静态初始化时运行的某些代码取决于MFC中需要初始化的其他内容。所以很明显,它需要被init_seg
绑定(bind),但是在哪里? compiler
仅适用于编译器和运行时,并且您的框架 Material (MFC)可能用于允许用户使用的init_seg(user)
中,因此您可以在compiler
和user
之间获得一个中间级别,即lib
。
现在很少需要这样的东西了,因为程序使用的大多数C++库本身都不是由多个库使用的,因此不需要确保在所有其他“普通”库之前已对其进行了初始化。 MFC这样做了,因为您可能已经从一个或多个供应商处购买了第三方MFC控件或其他库,而那些库依赖于MFC,并且它们可能在其构造函数中使用了MFC事物,并且您可能静态地使用了这些库中的对象,因此MFC需要在其他库之前进行初始化。
但是在大多数情况下,您的库不会成为人们正在使用的其他C++库的依赖项。因此,没有任何一种依赖链可以在其他库之前初始化您的库。是的,可能需要在用户代码之前初始化您的库,但是没有任何需要初始化它们的顺序。所以init_seg(user)
对所有这些都很好。
而且,Microsoft(通常,大多数C++专家)会告诉您:如果存在某种顺序依赖性,则在静态初始化应用程序时需要初始化单独的库,那么您做错了。严重地。那里有一个设计问题。
因此,为了回应评论:这不是编译器错误。这是用户警告。相当良性:如果忽略它,一切都不会出错(不像说忽略从long到int的转换警告)。但是,如果您使用的是init_seg(lib)
,则您可能可能并不真正了解该编译器功能的全部内容,因此他们希望您考虑一下。在考虑之后,如果仍然要这样做,请关闭警告。
关于c++ - init_seg和库代码中的警告C4073?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32085048/
你好,我正在尝试在 opensuse 中创建一个 Shell 脚本来创建 MySqlUsers,但是当我尝试运行它时,我得到了这个错误: Warning: Could not start progra
我阅读了有关此错误的所有信息,但未能找到任何解决方案。 我有一个看起来像这样的简单页面: $xmlfile = "/var/www/marees.xml"; //Fichier dans lequel
运行 Websphere App 服务器 V8.5 Liberty Profile。我找不到任何可以解决这些警告的帮助。我在 eclipse 。 ************** He
我尝试在 GC AppEngine 上部署应用程序。部署过程中没有错误,但应用程序无法运行(仅显示加载页面)。日志中唯一一个奇怪的原始 OpenBLAS WARNING - could not det
我刚开始学习 RestKit。我正在尝试使用它来使用 Foursquare api 获取附近的 field 。但每次我尝试“objectLoader:(RKObjectLoader *)objectL
我对 Vuejs 比较陌生,每次按键时都会收到以下警告: [Vue warn]: $attrs is readonly. found in ---> at src\component
Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external
我在尝试修改某些表时不断收到此错误。这是我的代码: /** = 1){ //$this->mysqli->autocommit(FALSE); //insert th
当我尝试使用 PHP 的 ftp_put 函数上传文件时,早些时候出现错误: 警告:ftp_put() [function.ftp-put]:无数据连接 现在,我尝试开启被动模式: ftp_pasv(
我一直在努力让这段代码适用于现阶段的年龄。它旨在计算一个范围内的素数,我已经编写了一种方法来打印它们。不幸的是,代码将无法编译,引用警告: “警告:[未检查] 未检查调用 add(E) 作为原始类型
尝试使用带有架构组件和Kotlin的Android Studio 3 Canary 5构建示例会给出此警告。 谁能告诉我原因? 谢谢,Ove 编辑#1: 这是Dan Lew前段时间制作的样本 http
我正在编写一个 Shiny 的应用程序,它运行得非常好,突然我收到两条警告消息。我已经回到以前运行良好的副本,它们现在显示相同的错误消息,所以我真的很困惑。我的代码仍然运行并在我 Shiny 的仪表板
03-25 05:52:15.329 8029-8042/com.mgh.radio W/MediaPlayerNative: info/warning (703, 0) 03-25 05:52:15
我在构建时在我的 gradle 控制台中收到一条警告消息: 警告:[options] 引导类路径未与 -source 1.7 一起设置 1 条警告 我怎样才能解决这个问题? 任何帮助表示赞赏! 最佳答
我有下一个代码: 测试.c #include "a1.h" int main() { int a = 8; foo(a); return a; } a1.h void foo
我的程序中有一个 WORD 变量。 WORD hour; 但是当我比较它的时候 if(hour>=0 && hour=0 && hour=0 的比较,它始终适用于 hour 是 WORD 类型,它是一
安全研究人员警告称,一个最新的严重的Java错误,其本质与目前在全球范围内利用的臭名昭著的 Log4Shell 漏洞相同 。 CVE-2021-42392 尚未在国家漏洞数据库 (NVD) 中
安装SqlServer2005时“版本变更检查 (警告)"问题排查 今天同事在安装SqlServer2005时遇到“版本变更检查 (警告) ”问题导致安装失败,警告提示如下: - 版本
我的 UWP 项目中出现以下警告。我已经标记了解决方案的示例,但我更感兴趣的是为什么在同一平台上创建另一个空项目时不会出现此警告? APPX4001: Build property AppxBundl
我试图修复我的登录脚本,在我的本地主机上它可以工作,但上传到我的在线测试服务器时,注销被破坏,我得到这个错误: Warning: session_destroy() [function.session
我是一名优秀的程序员,十分优秀!