首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >A#在C中定义,带三个点

A#在C中定义,带三个点
EN

Stack Overflow用户
提问于 2012-09-15 12:56:24
回答 1查看 10K关注 0票数 13
代码语言:javascript
复制
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))

这是这两个宏的定义;在后面的代码中,LOGILOGW是这样使用的

代码语言:javascript
复制
LOGI("accelerometer: x=%f y=%f z=%f",
                                event.acceleration.x, event.acceleration.y,
                                event.acceleration.z);

这条路

代码语言:javascript
复制
LOGW("Unable to eglMakeCurrent");

因为我尽量避免使用复杂的宏和#define,所以我不能理解这个宏的实际含义。3点符号在这里的作用是什么?此#define稍后在代码中更改了什么?

显然,我知道这3个点是用来表示和不确定数量的论点的,但我不知道如何理解这种情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-15 13:05:46

C99标准引入了可变的宏,即类似函数的宏,它可以接受可变数量的参数。

引用C标准的latest draft,第6.10.3节:

如果宏定义中的标识符列表不是以省略号结尾,则调用类似函数的宏时调用中的参数(包括那些不包含预处理标记的参数)的数量应等于宏定义中的参数数量。否则,调用中的参数应多于宏定义中的参数(不包括...)。应存在)终止调用的预处理令牌。

标识符__VA_ARGS__只能出现在参数中使用省略符号的类函数宏的替换列表中。

..。

如果宏定义中的标识符列表中有...,则尾随参数(包括任何分隔的逗号预处理标记)将合并为单个项目:变量参数。这样组合的参数的数量是这样的:合并后,参数的数量比宏定义中的参数数量多一个(不包括...)。

在下一小节中:

替换列表中出现的标识符__VA_ARGS__应被视为参数,变量参数应形成用于替换它的预处理标记。

因此,您可以使用任意数量的参数调用LOGILOGW,它们都将在定义中通过引用__VA_ARGS__指定的位置展开。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12434626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档