为什么头文件在 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通常因目标不同而不同,您不会直接将其包含在您自己的应用程序中。
我正在 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通常因目标不同而不同,您不会直接将其包含在您自己的应用程序中。