LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3588|回复: 22

[C] 一个函数声明中带了两个##,什么意思?

[复制链接]
发表于 2005-5-19 15:40:56 | 显示全部楼层 |阅读模式
cpLog_impl_ (priority__, __FILE__, __LINE__, fmt__ , ##args__);

这两个##是做什么的?
发表于 2005-5-19 16:03:31 | 显示全部楼层
我所知的,如
#define MAKE_COLORSPACE(SIZE,PIXELS,VPIXELS,FUNC) \
void fun1 \
{  \
    FUNC##_ROW(SIZE);  \
}
如上我创建了一个宏函数。
然后我这样调用:
MAKE_COLORSPACE(XVID,6000,352*288,288,YUY2)
编译器会扩展为
void fun1
{
YUY2_ROW(6000);
}

不知这样你能否明白。
回复 支持 反对

使用道具 举报

发表于 2005-5-19 16:05:16 | 显示全部楼层
但是这两个“井井”是在FUNC后面,你的那个是在argc__的前面。有什么差别,就不清楚了。
回复 支持 反对

使用道具 举报

发表于 2005-5-19 16:16:35 | 显示全部楼层
经过一会的阅读。我发现放前放后都一样,都是代表引用函数参数列表中的一个参数。
回复 支持 反对

使用道具 举报

发表于 2005-5-19 16:22:12 | 显示全部楼层
这是一个不定参数的宏里对一个普通函数的调用吧?
例如:
#define perr_exit(format, ...) \
do { \
    fprintf(stderr, format, ##args); \
    exit(1); \
} while (0)

##args是GNU的写法,C99用的是__VA_ARGS__
回复 支持 反对

使用道具 举报

发表于 2005-5-20 09:33:50 | 显示全部楼层
Post by Illidan
cpLog_impl_ (priority__, __FILE__, __LINE__, fmt__ , ##args__);

这两个##是做什么的?

##这里起的是字符串链接作用。
放在这里是它的一种特殊用法。表示当args__为空时,去掉前面的逗号。
回复 支持 反对

使用道具 举报

发表于 2005-5-20 09:43:09 | 显示全部楼层
原来如此,推荐为华为c程序员面试题。
回复 支持 反对

使用道具 举报

发表于 2005-5-20 10:03:04 | 显示全部楼层
Post by kj501
##这里起的是字符串链接作用。
放在这里是它的一种特殊用法。表示当args__为空时,去掉前面的逗号。


不是吧?这个很明显是个不定参数的宏里调用一个不定参数的函数(cpLog_impl_)啊。
cpLog_impl_ (priority__, __FILE__, __LINE__, fmt__ , ##args__);
看函数的第4个参数fmt(format)就知道了,cpLog_impl_是一个和sprintf有点像的函数,可能它还会再调用vsprintf。
回复 支持 反对

使用道具 举报

发表于 2005-5-20 10:07:10 | 显示全部楼层
__FILE__是当前的c文件名,__LINE__是当前的行数,所以函数cpLog_impl是用于在出现错误时log出错信息的。
回复 支持 反对

使用道具 举报

发表于 2005-5-20 10:09:56 | 显示全部楼层
晕,到底哪个对。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表