gpt4 book ai didi

c - 为什么一些库例程同时实现为宏?为什么将 "va_arg"宏声明为函数(没有 "#define")?

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:04 24 4
gpt4 key购买 nike

我很难用语言表达清楚。所以让我把它分成几个部分。上下文来自 Mike Banahan 的 C 书(下面每个部分都提供了链接)。以下是我的问题,以粗体显示:

  • 为什么一些库函数也同时实现为宏?有什么需要?这是我从书中读到的 (Section 9.1.1) :

A last general point is that many of the library routines may be implemented as macros, provided that there will be no problems to do with side-effects (as Chapter 7 describes). The Standard guarantees that, if a function is normally implemented as a macro, there will also be a true function provided to do the same job. To use the real function, either undefine the macro name with #undef, or enclose its name in parentheses, which ensures that it won't be treated as a macro:

  • va_start,我们知道,是函数还是宏?这本书的以下文字是混淆的根源,因为它暗示两者在同一口气中,在相邻的行中! (Section 9.9)

Before any attempt can be made to access a variable argument list, va_start must be called. It is defined as

 #include <stdarg.h>
void va_start(va_list ap, parmN);

The va_start macro initializes ap for subsequent use by the functions va_arg and va_end.

  • 最后,最令人困惑的部分。在下面的行中,它清楚地写着 va_arg 是一个宏,并继续展示它是如何实现的。但是,如何在没有#define 关键字的情况下实现宏,并且还带有返回类型('type'),就好像它是一个函数一样? (Section 9.9)

Once initialized, the arguments supplied can be accessed sequentially by means of the va_arg macro. This is peculiar because the type returned is determined by an argument to the macro. Note that this is impossible to implement as a true function, only as a macro. It is defined as

#include <stdarg.h>
type va_arg(va_list ap, type);

非常感谢您的回答。谢谢。

最佳答案

这是两个截然不同的问题。

首先,va_startva_argva_end 保证是宏。 va_arg 不能是函数,因为它的第二个参数是类型而不是值。

至于为什么有些函数也是宏:因为您希望内联调用以使其更快,但您可能还想获取它的地址并将其放入函数指针中:

int (*function_pointer)(int, FILE *) = &(putc);

关于c - 为什么一些库例程同时实现为宏?为什么将 "va_arg"宏声明为函数(没有 "#define")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26164849/

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