本文介绍了在C A的#define有三个点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#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__))

这是这2宏定义;后来在code LOGI LOGW 这种方式使用

This is definition for these 2 macros; later in the code LOGI and LOGW are used this way

LOGI("accelerometer: x=%f y=%f z=%f",
                                event.acceleration.x, event.acceleration.y,
                                event.acceleration.z);

和这样

LOGW("Unable to eglMakeCurrent");

由于我尽量避免复杂的宏和的#define 一般,我不能得到什么这个宏实际上意味着。什么是三个点符号在这里的作用?这是什么的#define 变化以后在code?

Since I try to avoid complex macros and #define in general, I can't get what this macro actually means. What is the role for the 3 dots notation here? What does this #define change later in the code?

很明显,我知道,3点被用来指示和参数不确定的量,但我不知道怎么看这种情况。

Obviously I know that the 3 dots are used to indicate and indefinite amount of arguments, but I don't know how to read this situation.

推荐答案

推出C99标准的可变参数宏的,即函数宏,可以采取可变数目的参数。

The C99 standard introduced variadic macros, i.e., function-like macros that can take a variable number of arguments.

引述,第6.10节0.3:

Quoting the latest draft of the C standard, section 6.10.3:

如果标识符列表中的宏定义不以结束
  省略号,参数的数量(包括那些论据
  在的调用由无preprocessing令牌)
  函数宏应等于在宏的参数数量
  定义。否则,应在调用多个参数
  以外还有宏定义的参数(不包括 ... )。
  有应存在)preprocessing令牌终止
  调用。

标识符 __ __ VA_ARGS ,应只在替换列表出现
  一个使用省略号表示法的一个函数宏
  参数。

The identifier __VA_ARGS__ shall occur only in the replacement-list of a function-like macro that uses the ellipsis notation in the parameters.

...

如果有一个 ... 在标识符列表中的宏定义,
  然后尾随参数,包括任何逗号分开
  preprocessing令牌,被合并成一个单一的项目:在变量
  参数
的。如此组合的参数数量是这样的,
  合并之后,参数的数量比数多一个
  在宏定义的参数(不包括 ... )。

和下一小节:

这是发生在替换列表的标识符 __ __ VA_ARGS
  被视为好像它是一个参数,以及可变参数应
  形成用来代替它preprocessing令牌。

所以,你可以调用 LOGI LOGW 与许多参数,只要你喜欢,他们将全部是在被引用的定义中指定的地点扩展到 __ __ VA_ARGS

So you can invoke LOGI or LOGW with as many arguments as you like, and they'll all be expanded at the place specified in the definition by the reference to __VA_ARGS__.

这篇关于在C A的#define有三个点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 01:20