作为比较操作数的结构不可用是C中更明显的事情之一(对我而言)没有多大意义.结构可以通过值传递并通过赋值复制,但==不是为它们指定的.
下面是C11标准(草案)的相关部分,它们定义了相等运算符(==和!=)和简单赋值运算符(=)的约束.注意在等式运算符的约束中缺少结构和联合.(除了_Atomic在C99中没有处理措辞是相同的).
6.5.9平等运营商
约束
以下其中一项应持有:
- 两个操作数都有算术类型;
- 两个操作数都是指向兼容类型的限定或非限定版本的指针;
- 一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的void的指针; 要么
- 一个操作数是一个指针,另一个是空指针常量.
6.5.16.1简单分配
约束
以下其中一项应持有:
- 左操作数具有原子,限定或非限定算术类型,右边有算术类型;
- 左操作数具有与右侧类型兼容的结构或联合类型的原子,限定或非限定版本;
- 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,左侧指向的类型具有全部右边指出的那种限定词;
- 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的指针void,左边指向的类型具有右边指向的所有类型的限定符;
- 左操作数是一个原子,限定或非限定指针,右边是一个空指针常量; 要么
- 左操作数的类型为atomic,qualified或nonqualified _Bool,右边是指针.
任何人都可以解释为什么存在这种差异(没有推测)?
假设您想要一个 makefile 来生成一个以父目录命名的文件。一种方法是对目标名称进行硬编码,但这不是很“通用”,例如
TARGET := dirname.pdf
$(TARGET): $(TARGET:.pdf=.tex)
pdflatex $(@:.pdf=.tex)
Run Code Online (Sandbox Code Playgroud)
通过 make 函数检索目录名称会更好。SA 上有关于如何检索 makefile 的完整路径的各种问题(和答案)(例如,/sf/answers/1269593951/)但不是父目录的名称的各种问题(和答案)...
在 GNU make 中最有效和可移植的方法是什么?