C中的标准标识符和预定义函数之间有什么区别?

wwodge7n  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(80)

我刚开始学习C,我遇到了对 * 标准标识符 * 的引用,比如printfscanf
这些函数和本书后面描述的预定义函数(如sqrt)之间的 * 区别是什么?
我只是想概念化(原文如此-我是一个英国人哈哈)为我的发展知识。
printf()是一个函数调用吗?它接受一个论点,不是吗?
区别是基于它们是否可以改变,如果我选择,或者它们来自哪里?
谢谢,
(The我指的是《C语言中的问题解决和程序设计》(Problem Solving and Program Design in C)

mrwjdhj3

mrwjdhj31#

这些术语(“* 标准标识符 "、“ 预定义函数 *”)都没有出现在ISO C11 standard中。
C11 6.4.1描述了 * 关键字 *,例如longforreturn
C11 6.4.2将 * 标识符 * 描述为
一个标识符是一个非数字字符(包括下划线_、小写和小写拉丁字母以及其他字符)和数字的序列,它表示6.2.1中描述的一个或多个实体。小写字母和小写字母是不同的。对标识符的最大长度没有具体限制。
当在翻译阶段7期间将预处理标记转换为标记时,如果预处理标记可以转换为关键字或标识符,则将其转换为关键字。
C11 7.1.2描述了 * 标准头文件 * 和 * 库函数 *。
C11 7.1.3将 * 保留标识符 * 描述为
每个头部声明或定义在其相关联的子子句中列出的所有标识符,并且可选地声明或定义在其相关联的未来库方向子子句中列出的标识符以及总是被保留用于任何用途或用作文件范围标识符的标识符。

  • 所有开始以下划线和小写字母或另一个下划线开头的标识符始终保留用于任何用途。
  • 所有以下划线开始的标识符始终保留用作普通名称空间和标记名称空间中文件范围的标识符。
  • 以下任何子条款(包括未来的库方向)中的每个宏名都保留,如果包含任何相关的头文件,则按指定使用;除非另有明确说明(见7.1.4)。
  • 以下任何子条款(包括未来的库方向)和errno中的所有具有外部链接的标识符始终保留用作具有外部链接的标识符。
  • 以下任何子条款(包括未来的库方向)中列出的具有文件范围的每个标识符都保留用作宏名称,并且如果包含任何相关的头,则用作同一名称空间中具有文件范围的标识符。

不保留其他标识符。如果程序声明或定义了一个标识符,而它是在一个上下文中被保留的(除了7.1.4允许的),或者将一个保留的标识符定义为一个宏名,则该行为是未定义的。
如果程序删除(使用#undef)上面列出的第一组中标识符的任何宏定义,则行为未定义。
此外,C11 7.31描述了 * 未来的库方向 *,其中包括对某些 * 保留标识符 * 模式的描述。
TL;DR:printfscanfsqrt都是 * 库函数 * 的 * 保留标识符 *。

相关问题