标题实现取代了其他实现
Header implementation replaced by other implementation
我想知道我最近尝试过的东西。这并不意味着是生产代码,只是我一起提出的东西,得到了一些我无法解释的怪异行为。也许有更多C 经验的人知道发生了什么。
我有一个包含内部实现的类的标头文件(我想向编译器暗示编译器将其内联(。我将此标头文件包含在编译为DLL的多个CPP文件中;然后,我尝试在编译为LIB(静态库(的多个CPP文件中使用相同的标头文件。
,由于我不需要进入的原因,我无法在该lib中的标题中使用std的getCurrentThreadId((API(但是同一API在编译/链接DLL时没有问题,没有问题(。所以。只是想解决这个问题(我知道这不是一个好练习,而是想试验(,我复制了原始的标题文件,然后删除了特定的呼叫到ThreadID API,而只是硬编码A -1而不是使用类型的方法。
因此,现在我有一个由CPP构建的DLL,包括带有threadID调用的.h文件,以及来自CPP的LIB构建,其中包括一个几乎相同的.h文件,其中带有硬编码ID = -1。dll引用lib文件。
现在,据我所知,在编译LIB时,标题内容在预兼容期间被注入CPP文件,然后进行汇编。这意味着LIB文件应包含与该硬编码-1的对象代码。然后,当我编译DLL时,另一个标头文件将注入CPP文件,并编译CPP代码。然后,在链接时,lib被加载到dll中。
因此,我希望在运行时,LIB的代码使用硬编码-1,以及来自DLL的代码来使用实际的螺纹ID。但令我惊讶的是,他们似乎都使用了实际的线程。即使在编译LIB时,它也抱怨螺纹。
那么,我是否错过了所有这些?我知道我在做什么不是很好的做法,但对结果感到惊讶。谢谢。
您的程序通过违反一个定义规则表现出未定义的行为:
[basic.def.odr]/6 可以有一个以上的定义...内联函数具有外部链接...在一个程序中,规定每个定义出现在不同的翻译中单位,并提供的定义满足以下要求。鉴于在多个翻译单元中定义的名为
D
的实体,然后(6.1( -
D
的每个定义应由相同的令牌序列组成;和...
实际上,典型的实现将使编译器发射到使用它的每个对象文件中,并指示链接器选择一个 - 任何一个 - 并丢弃其余部分(在假设它们是的假设下所有相同(。
- 如何制作 cmakelists.txt编译使用在其他地方声明和实现的函数和类的 CPP
- 如何创建一个接口,允许我访问C++中的按钮(和其他ui)函数,该函数是使用python中的MFC实现的
- 标题实现取代了其他实现
- 实现文件只能识别其他类的远期声明
- 有没有办法实现从 c++ 中其他抽象类多重继承的抽象类?
- 如何从实现与其他接口共享的接口的类继承
- 允许其他基类实现虚拟函数
- 除了堆栈和堆模型之外,还为C++实现了哪些其他形式的自动和动态存储
- 在其他类中实现访问类
- 在其他类中实现std ::类似阵列的构造函数
- 如何在无法访问 vblank 的情况下实现平均 60(或 30,或其他数字)FPS?
- GCC 4.4 不实现 C++11 范围循环.它还支持哪些其他范围循环语法
- 函子 - 它们相对于未实现运算符的其他类具有什么能力 ( )
- C++ std::random 如何实现其他发行版
- C++如何用模板指定或其他方式实现
- 在其他实现文件中包含实现文件有什么用?
- 头文件应该包括其他头文件,还是由实现来决定
- float4::set_wxy(以及其他set-swizzle操作)的更好的SSE2实现
- std::vector 实现是否使用内部数组或链表或其他
- 如何实现指向其他乘法类型向量的C++向量