C 为什么文件中的所有大写字母都是文件*?

C 为什么文件中的所有大写字母都是文件*?,c,history,C,History,这对我来说似乎很奇怪,其他大多数事情都是小写的 有什么历史原因吗?几乎可以肯定都是大写,因为至少最初它是一个宏。现在,很可能它是一个typedef,但是没有人将名称改为boot(这样做会是一个非常糟糕的想法)。它是一个宏。历史上,宏的所有上限都是C。不幸的是,最近的趋势似乎打破了这一事实 小历史教训:另外,该文件是UNIX v7 libc stdio中的io缓冲区抽象。一个文件不一定代表一个物理文件,只是可以阻止IO的东西。资料来源: 内核也已经定义了“文件”: 正如其他人在这里说的,它现在

这对我来说似乎很奇怪,其他大多数事情都是小写的


有什么历史原因吗?

几乎可以肯定都是大写,因为至少最初它是一个宏。现在,很可能它是一个typedef,但是没有人将名称改为boot(这样做会是一个非常糟糕的想法)。

它是一个宏。历史上,宏的所有上限都是C。不幸的是,最近的趋势似乎打破了这一事实

小历史教训:另外,该文件是UNIX v7 libc stdio中的io缓冲区抽象。一个文件不一定代表一个物理文件,只是可以阻止IO的东西。资料来源:

内核也已经定义了“文件”:


正如其他人在这里说的,它现在可能是一个typedef,但我不认为C在79年有typedef,因为它只有结构。再说一次,我那时不是出生的,所以…:)

我不同意这个问题是“没有建设性的”。可能有一个明确的答案和历史上有趣的答案(我会在找到时间后验证)。最有可能的
文件
最初是一个宏,按照惯例,宏具有所有CAP名称。这可能是在C语言引入
typedef
之前。当前的C标准不允许将
文件
定义为宏;它暗示但没有明确说明它应该是一个
typedef
。注意,这是出于历史和兼容性的原因。@Rudy:大多数情况下,是的。然而,即使是从历史上看,这种推理也是相当糟糕的。宏都是大写的最初原因是对类似函数的宏发出了一个微妙的警告,这些宏可能会多次计算其参数。从一开始,将其用于类对象宏是一种愚蠢的一致性。我不同意将所有CAP用于类对象宏是一种愚蠢的一致性。“所有宏的所有大写”可以更容易地避免名称冲突。它不是所有实现中的宏,只是一种形式或另一种形式的类型别名。(参见达尔文的
/usr/include/stdio.h
,其中文件直接定义为单个
typedef struct{}文件
声明的一部分。)事实仍然是,标准库中的所有其他此类结构类型别名(
size\t
time\t
,甚至
stdio中的
fpos\t
)是用完全不同的惯例写的。明显的名称(也可以避免与内核的
文件发生冲突)是
文件(或
流,等等)。我从来没有见过这个问题的完整历史答案。你能更正一下链接吗?它们现在不工作。
文件
在任何一致性实现中都不是宏。C标准第7.21.1节列出了
中定义的宏<代码>文件
不是其中之一。严格一致的程序可以在内部范围内声明名为
FILE
的变量,即使它有
#include
;制作
文件
宏会破坏这些程序。(很可能在将
typedef
s添加到语言之前,它是一个宏。)