[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的定义中的内容:



    (其中streamgetc的参数使用的名称。)

    解释标准

    您问(略作释义):

  • 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/

    10-13 09:43