2

我相信一定有关于它的讨论,但我就是不明白为什么isspaceC 和 C++ 不一致

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

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

clang 在下面报告 isspace 的声明:

# 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

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

4

3 回答 3

2

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

在 C 中,标准定义isspace为库函数。与任何标准库函数一样,允许但不要求实现将其另外定义为宏——只要宏与函数执行相同的操作即可。如果它被定义为一个宏,你总是可以绕过它来访问该函数:

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

或者

#undef isspace
isspace(c);

但是除非你需要一个指向函数的指针,否则很少有理由这样做。

在 C++ 中,宏不受命名空间的影响,因此std::isspace不能引用宏。根据实现的不同,它可能引用与isspaceC 中引用的相同函数。您仍然可以通过使用#include <ctype.h>或不使用std::前缀来引用宏。

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

于 2013-06-03T00:24:48.887 回答
2

C++ 有一个函数,如果它实际上是一个宏template< class CHAR > bool isspace( CHAR, const std::locale& );,它会严重破坏。isspace从历史上看,在 C 中,出于性能原因,它是一个宏。

于 2013-06-02T22:35:03.573 回答
0

你在说什么区别?这些只是同一功能的两个不同名称。

C 语言库

C++ 库包含与以相同头文件结构组织的 C 语言库相同的定义,但有以下区别:

  • 每个头文件与 C 语言版本具有相同的名称,但带有“c”前缀且没有扩展名。例如,C 语言头文件的 C++ 等效项 <stdlib.h><cstdlib>.

  • 库的每个元素都在std命名空间中定义。

(从这里


好的,如果你看看ctype.h你提到的那些行,你会注意到第 120 行声明了这个函数。第 207 行给出了它的实现。

你不应该关心这一切。真的。

于 2013-06-02T13:47:52.323 回答