#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__))这是这两个宏的定义;在后面的代码中,LOGI和LOGW是这样使用的
LOGI("accelerometer: x=%f y=%f z=%f",
event.acceleration.x, event.acceleration.y,
event.acceleration.z);这条路
LOGW("Unable to eglMakeCurrent");因为我尽量避免使用复杂的宏和#define,所以我不能理解这个宏的实际含义。3点符号在这里的作用是什么?此#define稍后在代码中更改了什么?
显然,我知道这3个点是用来表示和不确定数量的论点的,但我不知道如何理解这种情况。
发布于 2012-09-15 13:05:46
C99标准引入了可变的宏,即类似函数的宏,它可以接受可变数量的参数。
引用C标准的latest draft,第6.10.3节:
如果宏定义中的标识符列表不是以省略号结尾,则调用类似函数的宏时调用中的参数(包括那些不包含预处理标记的参数)的数量应等于宏定义中的参数数量。否则,调用中的参数应多于宏定义中的参数(不包括
...)。应存在)终止调用的预处理令牌。
标识符__VA_ARGS__只能出现在参数中使用省略符号的类函数宏的替换列表中。
..。
如果宏定义中的标识符列表中有
...,则尾随参数(包括任何分隔的逗号预处理标记)将合并为单个项目:变量参数。这样组合的参数的数量是这样的:合并后,参数的数量比宏定义中的参数数量多一个(不包括...)。
在下一小节中:
替换列表中出现的标识符
__VA_ARGS__应被视为参数,变量参数应形成用于替换它的预处理标记。
因此,您可以使用任意数量的参数调用LOGI或LOGW,它们都将在定义中通过引用__VA_ARGS__指定的位置展开。
https://stackoverflow.com/questions/12434626
复制相似问题