为什么FILE全部大写如FILE*?

jm1*_*890 12 c history

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

有一些历史原因吗?

Del*_*ted 11

这是一个宏.历史上,宏已经在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年有类型的因为它只有结构.然后我再也没出生那么...... :)

  • 它在所有实现中*不是*一个宏,只是一种或另一种形式的类型别名。(参见例如 Darwin 上的 `/usr/include/stdio.h`,其中 FILE 直接定义为单个 `typedef struct { } FILE` 声明的一部分。)事实仍然是所有其他此类结构类型别名在标准库(`size_t`、`time_t`,甚至`stdio` 中的`fpos_t`)是按照完全不同的约定编写的。明显的名称(也避免与内核的`file` 冲突)是`file_t`(或`stream_t` 等)。我从未见过这个问题的完整历史答案。 (2认同)
  • 你可以请更正链接吗?他们现在不工作了. (2认同)
  • `FILE` 不是*任何*符合的实现中的宏。C 标准第 7.21.1 节列出了 `<stdio.h>` 中定义的宏;`FILE` 不是其中之一。严格遵守的程序可能会在内部作用域中声明名为“FILE”的变量,即使它具有“#include <stdio.h>”;将“FILE”设为宏会破坏此类程序。(在将“typedef”添加到语言之前,它很可能是一个宏。) (2认同)

Jer*_*fin 5

这几乎可以肯定,因为至少原来它是一个宏.如今,很有可能它是一个typedef而不是,但没有人改变名称来启动(这样做会是一个非常糟糕的想法).

  • 我不同意对象类宏使用全部大写是一种愚蠢的一致性.*all*宏的全部大写使得更容易避免名称冲突. (2认同)