C 为什么“fopen”函数不使用枚举?

C 为什么“fopen”函数不使用枚举?,c,stdio,C,Stdio,使用const char*来选择打开模式而不是像这样的枚举的原因是什么: enum open_mode { READ, READ_BINARY, WRITE, ... }; 使用枚举不会更简单?这是为实现提供自由。例如,中的实现可以选择编码,例如:fopentest.xml、wt+、ccs=UNICODE原因很可能是历史原因:函数fopen在早期的K&R版本的语言中已经存在,而enum仅为ANSI标准添加到语言中 添加enum时,

使用const char*来选择打开模式而不是像这样的枚举的原因是什么:

enum open_mode {
        READ,
        READ_BINARY,
        WRITE,
        ...
};

使用枚举不会更简单?

这是为实现提供自由。例如,中的实现可以选择编码,例如:fopentest.xml、wt+、ccs=UNICODE

原因很可能是历史原因:函数fopen在早期的K&R版本的语言中已经存在,而enum仅为ANSI标准添加到语言中


添加enum时,该语言已被广泛使用,因此更改如此重要函数的签名是不切实际的。

这可能是一个设计决策。你们也可以试着在程序员网络中问这个问题;你在那里可能会更幸运。我认为早期C的遗留问题缺少枚举。一个非常类似的问题:另一个问题的答案主要是推测:嗯,我认为K&R1有枚举。我的副本在办公室,今天晚些时候我会检查它;我添加此评论主要是为了提醒自己。@KeithThompson您是《K&R》第一版的幸运拥有者之一吗?我只买了第二版,不过我是从第一版的俄文翻译中学来的。维基百科说,在《K&R C》出版后的几年里,该语言增加了一些功能,AT&T的编译器,特别是PCC[19]和其他一些供应商支持这些功能。其中包括:。。。枚举类型。是的,我第一次从K&R1学习C。我还将检查它是否提到fopen,我知道它有。如果它有fopen而没有enum,则可以从答案中删除最有可能的。K&R1没有enum。它确实提到了fopen,并显示了一个示例实现。这个实现只检查*mode的值,并且允许'r'、'w'或'a',因此不允许二进制模式或多个字符。我认为这是正确的答案。因为在出现枚举之前,人们通常出于同样的目的使用INT和定义的宏常量,而不是使用字符串。当然,但实现可以向枚举类型添加更多元素。@KeithThompson:如果不为变量流属性引入奇怪的varargs:wb,reclen=80是C理论的一个例子。@cremno:True,但fopen的原始作者可能并不关心这一点。无论如何,这是正确的;fopen比enum早。@KeithThompson:我同意它回答了这个问题。不管我发现了什么。它更宽。不过,还没有一个明确的答案。