gpt4 book ai didi

c - getc 是宏还是函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:50 26 4
gpt4 key购买 nike

我试图找到 getcfgetc 之间的区别。当时我看到这样的说法:

The difference between getc and fgetc is that getc can be implemented as a macro, whereas fgetc cannot be implemented as a macro.

那么,getc 到底是一个函数还是一个宏?如果它是宏,它会调用其他一些函数。那么,getc是不是用C实现的呢?

最佳答案

The difference between getc and fgetc is that getc can be implemented as a macro, whereas fgetc cannot be implemented as a macro.

这是不正确的。

除了少数异常(exception),任何 C 标准库函数都可以另外实现为宏,但是对于如何编写该宏有一些限制(以便宏仍然可以用作如果它是一个函数)。

引用 N1570第 7.1.4 节:

Any function declared in a header may be additionally implemented as a function-like macro defined in the header, [...] Any invocation of a library function that is implemented as a macro shall expand to code that evaluates each of its arguments exactly once, fully protected by parentheses where necessary, so it is generally safe to use arbitrary expressions as arguments.

getc 的特别之处在于其中一个限制可能会放宽 (7.21.7.5):

The getc function is equivalent to fgetc, except that if it is implemented as a macro, it may evaluate stream more than once, so the argument should never be an expression with side effects.

fgetcgetc的声明是:

int fgetc(FILE *stream);
int getc(FILE *stream);

stream 参数(例如,在像 fgetc(stdin)getc(file) 这样的调用中几乎总是一个没有副作用,但规则仍然禁止将 fgetc 定义为对其参数求值不止一次的宏,以防程序员编写类似 fgetc(file_list[i++]) 的代码. getc 的规则放宽了,因此它可以定义为宏(在某些情况下效率更高),同时可能破坏 getc(file_list[i++])

fgetc 的情况下,将其实现为宏而不是函数可能不会有太大优势。关键是标准明确允许这样做。

So, is getc implemented in C or not?

也许吧。 任何 C 库函数都不需要在 C 中实现。某些函数可能在汇编程序或任何其他语言中实现——或者它们可能是编译器内部函数。通常大多数或所有 C 标准库函数都是用 C 实现的,但标准只规定了它们的工作方式,而不是它们的编写方式。

关于c - getc 是宏还是函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32742430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com