为什么newlib/libc源人为地混淆了C语法

为什么newlib/libc源人为地混淆了C语法,c,C,我正在努力实现自定义文件IO,并注意到newlib的源代码非常混乱 他们这样定义一切: #define _PTR void * #define _AND , #define _NOARGS void #define _CONST const #define _VOLATILE volatile #define _SIGNED signed #define _DOTS , ... #define _VOID void #defi

我正在努力实现自定义文件IO,并注意到newlib的源代码非常混乱

他们这样定义一切:

#define _PTR        void *
#define _AND        ,
#define _NOARGS     void
#define _CONST      const
#define _VOLATILE   volatile
#define _SIGNED     signed
#define _DOTS       , ...
#define _VOID void
#define _READ_WRITE_RETURN_TYPE int
_READ_WRITE_RETURN_TYPE _EXFNPTR(_write, (struct _reent *, _PTR,
                        const char *,
                        _READ_WRITE_BUFSIZE_TYPE));
然后像这样使用它

#define _DEFUN_VOID(name)       name(_NOARGS)
#define _CAST_VOID (void)
#define _EXFNPTR(name, proto)       (* name) proto
然后你会得到这样不一致的混乱:

#define _PTR        void *
#define _AND        ,
#define _NOARGS     void
#define _CONST      const
#define _VOLATILE   volatile
#define _SIGNED     signed
#define _DOTS       , ...
#define _VOID void
#define _READ_WRITE_RETURN_TYPE int
_READ_WRITE_RETURN_TYPE _EXFNPTR(_write, (struct _reent *, _PTR,
                        const char *,
                        _READ_WRITE_BUFSIZE_TYPE));
这样乱码有什么真正的好处吗?还是历史原因


在我看来,任何关于可移植性的伪装都是毫无意义的,因为它们在整个图书馆中是绝对不一致的。

这只是一个试图变得聪明的人,失败得很惨。等等,哈哈,是的,我想它已经来了。我希望你能提出一些意见,为什么会这样。我能看到的唯一原因是你很少阅读系统头文件,因为互联网上已经有大量关于它们的文档,所以不可读也没关系。由于newlib似乎针对许多不同的平台,如果您为所有基本内容定义宏,那么将更容易移植到支持或多或少C功能的新编译器。最后但并非最不重要的是,自动化脚本更容易解析这些文件,例如
\u EXFUN
始终意味着函数声明。这通常是不一致的,但我们不要忘记,这仍然是工作在大写恋物癖_ptr、_和也有误导性,_点,但有些人发现字母更可读_返回类型可能是抽象/泛化的一种尝试。顺便说一句,总的来说,我引用@fritzone.Voting重新开放。问题不是问我们的意见,而是问来源为什么这样写。这可以“正确”回答,例如通过链接到有关决策的适当文档/邮件列表条目。