C中的#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__)) 

这是这两个宏的定义; 稍后在代码LOGILOGW中使用这种方式

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

就这样

 LOGW("Unable to eglMakeCurrent"); 

由于我总是试图避免复杂的宏和#define ,我无法得到这个宏的实际含义。 这里的3点符号有什么作用? 这个#define后来在代码中有什么变化?

显然我知道3个点用于表示和无限量的参数,但我不知道如何阅读这种情况。

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

引用C标准的最新草案 ,第6.10.3节:

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

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

如果宏定义中的标识符列表中有... ,那么尾随参数(包括任何分隔逗号预处理标记)将合并为一个项: 变量参数 。 如此组合的参数数量使得在合并之后,参数的数量比宏定义中的参数数量多一个(不包括... )。

在下一小节中:

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

因此,您可以LOGW使用LOGW参数调用LOGILOGW ,并且它们都将通过对__VA_ARGS__的引用在定义中指定的位置进行扩展。