我遇到过两个 C++ 库从共享代码中导出完全相同的 C 函数符号的情况。当我现在编译一个链接两个库的可执行文件时,我没有收到来自 VC12 的任何链接器错误或警告。为什么是这样?它只是默默地选择了两个符号之一,我不知道选择了哪个。

extern "C" { __declspec(dllexport) int function(void* argument);}

有一个名为/FORCE 的标志,即使有多个定义的符号,它也可以说服 VC 进行编译,但未设置此标志。

我没有从微软找到任何官方信息,为什么这个链接。我期待收到 LNK4006 警告,但我没有。
  • 我只想知道这是预期的还是未定义的行为,只是没有巧合而已。我阅读了有关未普遍应用于 C 代码的单一定义规则的内容,但我找不到任何可靠的 VC 编译器声明。
  • 我可以假设,鉴于函数不使用任何单例,使用完全相同的代码和编译器标志,选择哪一个并不重要?
  • 最佳答案

    您违反了 one 定义规则
    您程序的行为是未定义的。

    请参阅 C++ 标准中的“3.2 一个定义规则 [basic.def.odr]”一节。



    3.2.6 节描述了何时可以有多个 定义
    程序中的类类型、具有外部链接的内联函数等。


  • 这是未定义的行为。
  • C++ 标准是主,而不是 VC 编译器。


  • 这仍然是未定义的行为 - 尽管程序可能看起来像预期的那样。
  • 关于c++ - 为什么我可以在 VC 中链接两个导出相同 C-Function 的库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35040614/

    10-13 08:59
    查看更多