Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 源代码中的条件编译_C_Visual C++ - Fatal编程技术网

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-嗯,如果用户的版本不是旧编译器的瓶颈,那么没有理由认为它将是新编译器的瓶颈。然而,交换实现可能成为开发的瓶颈。如果它没有坏,就不要修理它。