在 [7.1.4使用库函数] 中,我读到:
和
然后对于getc
, [7.21.7.5 getc函数] :
请问getc
的定义:
getc
作为宏单独实现(似乎不符合要求,但呢?),它可能会对其参数进行两次评估? 最佳答案
标准中的定义是一致的;您对它们的尝试解释并不完全一致。
标准说……
ISO/IEC 9899:2011(C11)标准说(引用第7.1.4节中的更多内容,并将一个大段的内容分成几部分):
请特别注意脚注185的内容。
您还引用了第7.2.1.7.5节中getc
的定义中的内容:
(其中stream
是getc
的参数使用的名称。)
解释标准
您问(略作释义):
getc
的定义是否与库函数的定义相矛盾?否。第7.1.4节的开头说“除非另有明确说明”,然后给出了一系列通用规则,然后
getc
的规范则另有明确规定。 否。第7.1.4节的开头部分说,任何特定功能的规范都可以覆盖第7.1.4节中的一般性。
我在这里看不到任何不连贯之处。
getc
仅作为宏实现(似乎不兼容,但是…),则该宏可能会对其参数进行两次评估?getc
可能不能仅作为宏来实现(脚注185)。还必须有一个实现相同功能的实际功能。实现可以很简单:int (getc)(FILE *fp) { return getc(fp); }
getc
的宏多次评估其自变量(但不需要这样做)。 §7.21.7.5中的规范明确指出可以这样做,而§7.1.4中的规范明确表示可以允许§7.21.7.5更改通常禁止这种行为的§7.1.4的一般规则。 关于c - getc()作为宏和C标准库函数定义是否一致?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39793885/