标题实现取代了其他实现



我想知道我最近尝试过的东西。这并不意味着是生产代码,只是我一起提出的东西,得到了一些我无法解释的怪异行为。也许有更多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的每个定义应由相同的令牌序列组成;和...

实际上,典型的实现将使编译器发射到使用它的每个对象文件中,并指示链接器选择一个 - 任何一个 - 并丢弃其余部分(在假设它们是的假设下所有相同(。

最新更新