问题描述
#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有三个点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!