'make install'被认为有害吗?

时间:2011-10-31 12:06:16

标签: c++ googletest

根据这篇文章,Google C ++测试框架认为“make install”是一种不好的做法。

http://groups.google.com/group/googletestframework/browse_thread/thread/668eff1cebf5309d

原因是该库违反了“一个定义规则”。

http://en.wikipedia.org/wiki/One_Definition_Rule

在线程的某个地方,它说:“如果你将不同的-DGTEST_HAS_FOO = 1标志传递给不同的翻译单元,你将违反ODR。或者有时人们使用-D 选择要使用的malloc库(debug vs release),你有 全面使用相同的malloc库。“

我的问题:

  1. 这个项目究竟做错了什么?
  2. 我们可以从中学到什么?我们怎样才能编写更具防御性的代码来防止违反ODR?

1 个答案:

答案 0 :(得分:5)

问题的直接答案是:不要编写依赖于编译器参数的代码。在这种情况下,整个讨论源于代码根据编译器标志(最可能通过#ifdef或其他预处理器指令)而不同的事实。这反过来意味着虽然代码库是相同的,但通过更改编译器标志,处理的代码将是不同的,并且使用一组标志编译的二进制文件将与使用不同编译的二进制文件不兼容一组标志。

根据实际项目的不同,可能无法将代码与编译器标志分离,您将不得不忍受它,但我建议尽量避免使用配置的代码来自编译器命令行,就像你应该避免DEBUG只有副作用的代码一样。如果不能,记录不同编译器标志的效果。