【问题标题】:Why is FILE all-caps as in FILE*? [closed]为什么 FILE * 中的 FILE 全大写? [关闭]
【发布时间】:2011-08-04 22:09:57
【问题描述】:

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

有什么历史原因吗?

【问题讨论】:

  • 它的 FILE*(全大写)。
  • 我不同意这个问题“没有建设性”。可能有一个明确的答案和历史上有趣的答案(我会在找到时间时验证)。 FILE 最有可能最初是一个宏,并且按照惯例,宏具有全大写的名称。这应该是在 typedef 被引入 C 语言之前。当前的 C 标准不允许将FILE 定义为宏;它暗示但没有明确声明它应该是typedef

标签: c history


【解决方案1】:

这是一个宏。历史上,宏在 C 中都有大写字母。不幸的是,最近的趋势似乎打破了这一事实。

小历史课:另外,FILE 是 UNIX v7 libc stdio 中的 io 缓冲区抽象。 FILE不一定代表物理文件,只是可以做块IO的东西。来源:

http://www.bsdlover.cn/study/UnixTree/V7/usr/include/stdio.h.html

“文件”也已被内核定义:

http://www.bsdlover.cn/study/UnixTree/V7/usr/include/sys/file.h.html

正如其他人所说,它现在可能是 typedef,但我认为 C 在 79 年没有 typedef,因为它只有结构。话又说回来,我还没有出生,所以...... :)

【讨论】:

  • 不是所有实现中的宏,只是一种或另一种形式的类型别名。 (参见 Darwin 上的 /usr/include/stdio.h,其中 FILE 直接定义为单个 typedef struct { } FILE 声明的一部分。)事实上,标准库中的所有其他此类结构类型别名(size_ttime_t , 甚至 stdio 中的 fpos_t) 都是以完全不同的约定编写的。显而易见的名称(也避免与内核的file 冲突)是file_t(或stream_t 等)。我从未见过这个问题的完整历史答案。
  • 能否请您更正链接?他们现在不工作了。
  • FILE 不是符合 any 的实现中的宏。 C 标准的第 7.21.1 节列出了在<stdio.h> 中定义的宏; FILE 不是其中之一。一个严格遵守的程序可以在内部范围内声明一个名为FILE 的变量,即使它有#include <stdio.h>;制作FILE 宏会破坏此类程序。 (在typedefs 被添加到语言之前,它很可能是一个宏。)
【解决方案2】:

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

【讨论】:

  • IOW,这是出于历史和兼容性的原因。
  • @Rudy:大多数情况下,是的。再说一次,即使从历史上看,推理也很糟糕。宏是全大写的最初原因是对类似函数的宏可能会多次评估其参数的微妙警告。将它用于类似对象的宏从一开始就是一种愚蠢的一致性。
  • 我不同意对类对象宏使用全大写是一种愚蠢的一致性。 all 宏的全大写可以更轻松地避免名称冲突。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2019-07-10
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 2023-03-21
相关资源
最近更新 更多