源代码中的条件编译

Posted

技术标签:

【中文标题】源代码中的条件编译【英文标题】:Conditional compiling in source code [duplicate] 【发布时间】:2016-01-26 14:07:51 【问题描述】:

我需要在我的代码中使用strncpy_s。代码需要使用 msvc71 以及 msvc90 编译器进行编译。事实证明,strncpy_s 在 msvc71 中不受支持。我已经实现了我自己版本的strncpy_s

所以我想只在编译器是msvc71的时候编译strncpy_s的这个实现。我该怎么做?

【问题讨论】:

有一个宏来识别编译器 _MSC_VER et al 你仍然可以在 msvc90 中使用strncpy。这比使用条件编译更干净。 @iharob - 为什么不呢?如果用户的版本正常工作,它就可以正常工作。 @iharob - 嗯,如果用户的版本不是旧编译器的瓶颈,那么没有理由假设它会成为新编译器的瓶颈。然而,交换实现可能成为开发的瓶颈。如果它没有坏,就不要修理它。 【参考方案1】:

使用条件编译不是一个很好的解决您的问题的方法:如果您以后使用另一个编译器或在不同的平台上编译,您将需要添加越来越多的特殊测试来处理这些可能支持也可能不支持@的环境987654321@。有一种标准方法可以请求这些扩展函数并检查它们是否可用,但我强烈建议您始终定义替换函数,将其命名为其他名称并无条件使用。

您可能知道,strncpystrncpy_s 不可互换,它们具有不同的语义,除了目标大小的额外参数。 strncpy 绝对不应该使用,因为它容易出错:即使你掌握了它特有的副作用,其他程序员以后阅读或修改你的代码也不会。 strncpy_s 有它自己的怪癖:违反约束的行为可能不是你所期望的。

【讨论】:

以上是关于源代码中的条件编译的主要内容,如果未能解决你的问题,请参考以下文章

条件编译在工作当中的应用

C语言条件编译(ifdefifndefendif)

GCC 编译器中的条件移动 (cmov)

XAML 条件编译

C#-#define条件编译

循环中的常量条件:编译器优化