咨询《Compiler Design in C》中两类特殊C语言语法的疑问
《Compiler Design in C》相关语法与代码问题解答
一、第41页“函数定义和变量声明未在大括号内”的语法
这是**K&R C(C89标准之前的旧版C语法)**的历史特性,并非现代标准C的写法。在早期C规范中,允许函数定义采用以下形式:
返回类型 函数名(参数名列表) 参数类型声明; 函数内变量声明; { // 函数体代码 }
简单来说:函数参数的类型可以在参数列表之后、函数体大括号之前单独声明,甚至函数内的部分变量也能放在大括号外面声明。这种写法在C89标准发布后被逐步淘汰,现代C(C99及之后)要求所有变量声明要么放在全局作用域,要么放在函数内的代码块中,函数参数也必须在参数列表里直接声明类型(即原型式声明)。
二、第103行代码的运行逻辑与(*Openp)调用解析
1. 整条语句拆解
先拆分代码逻辑:
if( (fd = !name? STDIN: (*Openp) (name, O_RDONLY | O_BINARY)) != -1)
这是嵌套了赋值和三目运算符的条件判断,执行顺序如下:
- 先判断
!name:如果name是空指针(NULL)或空字符串,!name结果为真,此时fd被赋值为STDIN(标准输入的文件描述符,通常为0); - 如果
name有效,就调用(*Openp)(name, O_RDONLY | O_BINARY),将返回值赋值给fd; - 最后判断
fd是否不等于-1(C中文件操作失败的典型返回值),若成立则进入if代码块。
2. (*Openp)(...)的含义
Openp是一个函数指针。在K&R C中,调用函数指针必须显式使用解引用运算符*,因此写成(*Openp)(参数)的形式。现代C允许直接写Openp(参数)(编译器会自动处理解引用),但旧规范要求必须显式解引用。
结合第40页的定义,Openp的类型应为int (*)(const char*, int),即指向一个“接受字符串指针和整数参数、返回整数(文件描述符)”的函数。这里它指向标准库的open函数(或自定义文件打开函数),O_RDONLY | O_BINARY表示以只读+二进制模式打开文件(O_BINARY是Windows平台特有的标记,用于区分文本/二进制文件)。
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

