在Windows上使用strdup时,我发现_strdup是特定于Windows的,但是当我在Linux上运行相同的代码时,它需要没有下划线的strdup。有没有人知道这种差异背后的历史,以及在编写跨平台代码时如何处理这个问题的一些信息?
发布于 2020-02-10 16:54:27
有几个函数是POSIX规范的一部分,即Linux和大多数其他UNIX变体,它们不是标准C的一部分。这些函数包括strdup、write、read等。
前导下划线的推理如下,摘自MSDN文档
通用C运行时库(UCRT)支持C++一致性所需的大多数C标准库。它实现了C99 (ISO/IEC9899:1999)库,但有一些例外:定义在. UCRT还实现了POSIX.1 (ISO/IEC9945-1:1996,POSIX系统应用程序接口)C库的一个大子集。然而,它并不完全符合任何特定的POSIX标准, UCRT还实现了一些与微软无关的功能和宏,而这些功能和宏并不是标准的一部分。 在vcruntime库中可以找到特定于Microsoft实现的VisualC++的函数。这些函数中有许多是内部使用的,不能被用户代码调用。一些文档用于调试和实现兼容性。 C++标准将以全局命名空间中的下划线开头的名称保留给实现。POSIX函数和Microsoft特定的运行时库函数都位于全局命名空间中,但不是标准C运行时库的一部分。这就是为什么首选的这些函数的微软实现有一个前导下划线。为了便于移植,也支持默认名称,但是当编译使用它们的代码时,微软C++编译器会发出弃用警告。只有默认名称被弃用,而不是函数本身。若要禁止警告,请在使用原始POSIX名称的代码中包含任何标头之前定义_CRT_NONSTDC_NO_WARNINGS。
我使用一个#define来检查程序是否正在为Windows编译,如果是的话,创建另一个#define来将POSIX名称映射到特定于Windows的名称。您可以检查几个选项,但最可靠的可能是_MSC_VER,它是定义的如果MSVC是编译器的话。
#ifdef _MSC_VER
#define strdup(p) _strdup(p)
#endifhttps://stackoverflow.com/questions/60154748
复制相似问题