gpt4 book ai didi

c++ - C/C++ 中的 isspace 声明不一致?

转载 作者:太空宇宙 更新时间:2023-11-04 01:34:32 25 4
gpt4 key购买 nike

我相信肯定有人讨论过它,但我就是不明白为什么 isspace 对于 C 和 C++ 不一致

(我正在使用clang分析器获取定义信息)

// test.c
#include <ctype.h>
int main(int argc, char *argv[]) {
isspace('a');
return 0;
}

下面是 isspace 声明的 clang 报告:

# define isspace(c) __isctype((c), _ISspace)  // LINE 207 in /usr/include/ctype.h

以及此代码段的时间:

// test.cpp
#include <cctype>
int main() {
std::isspace('t');
return 0;
}

clang 在这里报告声明:

__exctype (isspace);  // LINE 120 in /usr/include/ctype.h
// #define __exctype(name) extern int name (int) __THROW

那么为什么会有这样的差异呢?

最佳答案

只要它的行为始终如一,这就是 C 和 C++ 标准的全部要求。

在 C 中,标准定义了 isspace作为库函数。与任何标准库函数一样,允许(但不是必需)实现将其额外定义为宏——只要宏与函数做同样的事情。如果它被定义为一个宏,你总是可以绕过它来访问函数:

(isspace)(c) /* the parentheses around the name inhibit macro expansion */

#undef isspace
isspace(c);

但是除非您需要指向该函数的指针,否则几乎没有任何理由这样做。

在 C++ 中,宏不受 namespace 的影响,所以 std::isspace不能引用宏。根据实现的不同,它可能指的是与 isspace 相同的函数。在 C 中引用。您仍然可以使用 #include <ctype.h> 引用宏并且不使用 std::前缀。

但没有充分的理由这样做。 isspace告诉您它的参数是否为空白字符,这是它需要做的。

关于c++ - C/C++ 中的 isspace 声明不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16883302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com