C 源代码中的条件编译
我需要在我的代码中使用C 源代码中的条件编译,c,visual-c++,C,Visual C++,我需要在我的代码中使用strncpy\s。代码需要使用msvc71和msvc90编译器编译。事实证明,msvc71不支持strncpy_s。我已经实现了自己版本的strncpy\u 因此,我只想在编译器为msvc71时编译strncpy_s的这个实现。如何做到这一点?使用条件编译并不能很好地解决您的问题:如果以后使用另一个编译器或在不同的平台上编译,则需要添加越来越多的特殊测试来处理这些环境,这些环境可能支持也可能不支持strncpy。有一种标准方法可以请求这些扩展函数并检查它们是否可用,但我强
strncpy\s
。代码需要使用msvc71和msvc90编译器编译。事实证明,msvc71不支持strncpy_s
。我已经实现了自己版本的strncpy\u
因此,我只想在编译器为msvc71时编译strncpy_s的这个实现。如何做到这一点?使用条件编译并不能很好地解决您的问题:如果以后使用另一个编译器或在不同的平台上编译,则需要添加越来越多的特殊测试来处理这些环境,这些环境可能支持也可能不支持strncpy。有一种标准方法可以请求这些扩展函数并检查它们是否可用,但我强烈建议您始终定义替换函数,将其命名为其他函数并无条件使用
您可能知道,
strncpy
和strncpy_
是不可互换的,它们具有不同的语义,超出了目的地大小的额外参数<代码>strncpy绝对不应该使用,因为它很容易出错:即使你掌握了它特有的副作用,其他程序员以后阅读或修改你的代码也不会strncpy\u有它自己的怪癖:违反约束的行为可能不是您所期望的。使用条件编译并不是解决问题的好办法:如果以后使用其他编译器或在不同平台上编译,您需要添加越来越多的特殊测试来处理这些环境,这些环境可能支持也可能不支持strncpy\u
。有一种标准方法可以请求这些扩展函数并检查它们是否可用,但我强烈建议您始终定义替换函数,将其命名为其他函数并无条件使用
您可能知道,strncpy
和strncpy_
是不可互换的,它们具有不同的语义,超出了目的地大小的额外参数<代码>strncpy
绝对不应该使用,因为它很容易出错:即使你掌握了它特有的副作用,其他程序员以后阅读或修改你的代码也不会strncpy有自己的怪癖:违反约束的行为可能不是您所期望的。有一个宏来标识编译器您仍然可以在msvc90中使用strncpy
。这比使用条件编译更干净。@iharob-为什么不呢?如果用户的版本工作正常,它就工作正常。@iharob-嗯,如果用户的版本不是旧编译器的瓶颈,那么没有理由认为它将是新编译器的瓶颈。然而,交换实现可能成为开发的瓶颈。如果它没有损坏,就不要修复它。有一个宏可以识别编译器,您仍然可以在msvc90中使用strncpy
。这比使用条件编译更干净。@iharob-为什么不呢?如果用户的版本工作正常,它就工作正常。@iharob-嗯,如果用户的版本不是旧编译器的瓶颈,那么没有理由认为它将是新编译器的瓶颈。然而,交换实现可能成为开发的瓶颈。如果它没有坏,就不要修理它。