为什么头文件在 Windows 中有效,但在 Mac 和 Linux 中无效? (strrev)

Why does a header file work in Windows but not on Mac & Linux? (strrev)

我正在 C++ 代码中探索 cstring 的工作。常用的函数之一是strrev()

但是我发现这个函数在 Mac & Linux 上被认为是未定义的,即使我包含了头文件 <cstring><string.h>.

但是,该函数在 Windows 上运行良好。

(我知道我可以自己定义函数作为此处提供的解决方案strrev not available on Linux

这可能是一个非常幼稚的问题,但是头文件的定义在不同平台上不应该是相同的吗?还是每个平台对头文件的定义不同?

另一个奇怪的事情是我在 <cstring> 头文件 (cstring header file description) 的描述中没有找到 strrev(),但是如果我不包含这个头文件Windows 我得到一个错误,当我包含它时错误被解决了。

One of the functions that is commonly used is strrev().

实际上,除了编程课外,我想不出 任何 可行的理由 strrev() 会有用。我不认为在我整个数十年的职业生涯中我需要这样一个野兽:-)

它在某些平台中未定义的原因是 C++ 标准强制要求

它在其他一些实现中定义的原因是因为标准规定了必须可用的内容,而不是不可以使用的内容。 换句话说,实现 允许 包含它,只是 不需要 包含它。

一个实现可以选择包含各种美妙的额外内容,前提是它不会破坏标准规定的任何内容。

包含标准函数以外的某些函数是一个特定于实现的决定。

但是,在 C++ 中,您可以使用 <algorithm> header 中的 std::reverse 来反转字符串。

这是一个例子:

#include <iostream>
#include <algorithm>

int main()
{
    char s[] = "Hello World!";

    std::reverse( std::begin(s), std::end(s) );

    for ( const auto& i : s )
    {
        std::cout << i;
    }

    return 0; 
}

输出字符串:

!dlroW olleH

这里有一个 link,您可以在其中找到函数列表 & class,根据标准应该在 header 中:http://www.cplusplus.com/reference/

关于header本身的问题,C++标准并没有提出一个统一的header,而是要求什么的列表。

并且 header 中的定义甚至对于同一个编译器,从一个目标到另一个目标(32 位或 64 位等)也会有所不同。例如,如果您检查 GCC 的 iostream header,它包含 3 个文件:

#include <bits/c++config.h>
#include <ostream>
#include <istream>

bits/目录下的header通常因目标不同而不同,您不会直接将其包含在您自己的应用程序中。