为什么我可以链接两个在VC中导出相同C函数的库?

时间:2016-01-27 14:54:37

标签: c++ visual-c++ visual-studio-2013

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

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

有一个名为/ FORCE的标志,即使存在多重定义的符号,也可以设置VC进行编译,但是这个标志没有设置。

我没有找到微软的官方信息,为什么这个链接完全没有。我期待获得LNK4006警告,但我没有。

  1. 我只是想知道这是否是预期或未定义的行为,只是巧合不会爆发。我读过有关一般定义规则一般不适用于C-Code的事情,但我找不到任何可靠的VC编译器声明。
  2. 我可以假设,鉴于函数不使用任何单例,使用相同的代码和编译器标志,选择哪一个并不重要?

1 个答案:

答案 0 :(得分:2)

您违反了一个定义规则。 您的程序行为未定义。

参见" 3.2一节定义规则[basic.def.odr] "在C ++标准中。

  
      
  1. 每个程序都应包含每个非内联函数的唯一定义或该程序中使用的变量;无需诊断。 ...
  2.   

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

  
      
  1. 我只是想知道这是否是预期或未定义的行为,只是巧合不会爆发。我读过有关一般定义规则一般不适用于C-Code的事情,但我找不到任何可靠的VC编译器声明。
  2.   
  • 这是未定义的行为。
  • C ++标准是主服务器,而不是VC编译器。
  
      
  1. 我可以假设,鉴于函数不使用任何单例,使用相同的代码和编译器标志,选择哪一个并不重要?
  2.   
  • 它仍然是未定义的行为 - 尽管程序似乎表现得像预期的那样。