user-0 提问: linux c程序调用open函数为什么两个或三个参数都可以？

回复:
user: user-1
content: #include <stdio.h> #include <stdarg.h>   #define COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _ #define COUNT_PARMS(...)\     COUNT_PARMS2(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)  没有其他什么细节，所有东西都在这两个宏定义里面了。  首先，注意看 COUNT_PARMS2 这个宏，它是直接返回括号内第11个参数 其次，再看COUNT_PARMS这个宏： 如果它有1个参数，即__VA_ARGS__代表1个参数，那么COUNT_PARMS2的第11参数此时是1. 如果它有2个参数，即__VA_ARGS__代表2个参数，那么COUNT_PARMS2的第11参数此时是2. 如果它有3个参数，即__VA_ARGS__代表3个参数，那么COUNT_PARMS2的第11参数此时是3.    ... 如果它有10个参数，即__VA_ARGS__代表10个参数，那么COUNT_PARMS2的第11参数此时是10.

user: user-2
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-3
content: C语言不支持重载，但是支持可变参数。

user: user-4
content: 引用 9 楼 u010527305 的回复:[quote=引用 8 楼 mujiok2003 的回复:] [quote=引用 6 楼 u010527305 的回复:] #include <stdio.h> #include <stdarg.h>  #define COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _ #define COUNT_PARMS(...)\ 	COUNT_PARMS2(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) 	 static void print_strings2(int count, ...) { 	int i; 	va_list v; 	va_start(v, count); 	 	for (i = 0; i < count; i++) 	{ 		/* Grab next parameter + print it */ 		const char *s = va_arg(v, const char *); 		printf("%s\n", s); 	} 	 	va_end(v); }  #define print_strings(...)\ 	print_strings2(COUNT_PARMS(__VA_ARGS__), __VA_ARGS__)  #define display(fmt, args...) printf(fmt, args) #define show(fmt, ...) printf(fmt, ##__VA_ARGS__) #define debug(...) printf(__VA_ARGS__)  int main(void) { 	print_strings("m y", "n y"); 	//print_strings(""); 	//int n = 7; 	//char ch = 'a'; 	//debug("n = %d, ch = %c\n", n, ch); 	//display("n = %d\nch = %c\n", n, ch); 	//show("n = %d\nch = %c\n", n, ch); 	return 0 } 在问一下，那个COUNT_PARMS(...)怎么得到的参数个数？具体细节不清楚啊 Cpp（C预处理程序）知道细节。[/quote] 您知道细节么？麻烦讲解下， #define COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _ #define COUNT_PARMS(...)\ 	COUNT_PARMS2(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) COUNT_PARMS这个宏的实现细节，它怎么就得到参数的个数了呢？[/quote] cpp会解析你的源码文件呀。

user: user-0
content: 引用 8 楼 mujiok2003 的回复:[quote=引用 6 楼 u010527305 的回复:] #include <stdio.h> #include <stdarg.h>  #define COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _ #define COUNT_PARMS(...)\ 	COUNT_PARMS2(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) 	 static void print_strings2(int count, ...) { 	int i; 	va_list v; 	va_start(v, count); 	 	for (i = 0; i < count; i++) 	{ 		/* Grab next parameter + print it */ 		const char *s = va_arg(v, const char *); 		printf("%s\n", s); 	} 	 	va_end(v); }  #define print_strings(...)\ 	print_strings2(COUNT_PARMS(__VA_ARGS__), __VA_ARGS__)  #define display(fmt, args...) printf(fmt, args) #define show(fmt, ...) printf(fmt, ##__VA_ARGS__) #define debug(...) printf(__VA_ARGS__)  int main(void) { 	print_strings("m y", "n y"); 	//print_strings(""); 	//int n = 7; 	//char ch = 'a'; 	//debug("n = %d, ch = %c\n", n, ch); 	//display("n = %d\nch = %c\n", n, ch); 	//show("n = %d\nch = %c\n", n, ch); 	return 0 } 在问一下，那个COUNT_PARMS(...)怎么得到的参数个数？具体细节不清楚啊 Cpp（C预处理程序）知道细节。[/quote] 您知道细节么？麻烦讲解下， #define COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _ #define COUNT_PARMS(...)\ 	COUNT_PARMS2(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) COUNT_PARMS这个宏的实现细节，它怎么就得到参数的个数了呢？

user: user-4
content: 引用 6 楼 u010527305 的回复:#include <stdio.h> #include <stdarg.h>  #define COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _ #define COUNT_PARMS(...)\ 	COUNT_PARMS2(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) 	 static void print_strings2(int count, ...) { 	int i; 	va_list v; 	va_start(v, count); 	 	for (i = 0; i < count; i++) 	{ 		/* Grab next parameter + print it */ 		const char *s = va_arg(v, const char *); 		printf("%s\n", s); 	} 	 	va_end(v); }  #define print_strings(...)\ 	print_strings2(COUNT_PARMS(__VA_ARGS__), __VA_ARGS__)  #define display(fmt, args...) printf(fmt, args) #define show(fmt, ...) printf(fmt, ##__VA_ARGS__) #define debug(...) printf(__VA_ARGS__)  int main(void) { 	print_strings("m y", "n y"); 	//print_strings(""); 	//int n = 7; 	//char ch = 'a'; 	//debug("n = %d, ch = %c\n", n, ch); 	//display("n = %d\nch = %c\n", n, ch); 	//show("n = %d\nch = %c\n", n, ch); 	return 0 } 在问一下，那个COUNT_PARMS(...)怎么得到的参数个数？具体细节不清楚啊 Cpp（C预处理程序）知道细节。

user: user-4
content: #include <sys/stat.h>  #include <fcntl.h>  int open(const char *path, int oflag, ... );   可变参数

user: user-0
content: #include <stdio.h> #include <stdarg.h>  #define COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _ #define COUNT_PARMS(...)\ 	COUNT_PARMS2(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) 	 static void print_strings2(int count, ...) { 	int i; 	va_list v; 	va_start(v, count); 	 	for (i = 0; i < count; i++) 	{ 		/* Grab next parameter + print it */ 		const char *s = va_arg(v, const char *); 		printf("%s\n", s); 	} 	 	va_end(v); }  #define print_strings(...)\ 	print_strings2(COUNT_PARMS(__VA_ARGS__), __VA_ARGS__)  #define display(fmt, args...) printf(fmt, args) #define show(fmt, ...) printf(fmt, ##__VA_ARGS__) #define debug(...) printf(__VA_ARGS__)  int main(void) { 	print_strings("m y", "n y"); 	//print_strings(""); 	//int n = 7; 	//char ch = 'a'; 	//debug("n = %d, ch = %c\n", n, ch); 	//display("n = %d\nch = %c\n", n, ch); 	//show("n = %d\nch = %c\n", n, ch); 	return 0 } 在问一下，那个COUNT_PARMS(...)怎么得到的参数个数？具体细节不清楚啊

user: user-0
content: 是我幼稚了，很明显的事情没看出来。 谢谢大家，结贴

user: user-0
content: 引用 2 楼 mao236244378 的回复:变参函数.. 厉害，变参函数，解决了俺的问题。

user: user-0
content: 引用 1 楼 dbzhang800 的回复:http://locklessinc.com/articles/overloading/ 高手啊，给的链接太有用了。

user: user-5
content: 应该是一个宏判断他的参数是2个还是3个 然后调用

user: user-5
content: 变参函数..

user: user-1
content: http://locklessinc.com/articles/overloading/