What is "##" string in C code

See code below(quoting ffmpeg source code)
 1 #define REGISTER_MUXER(X,x) { \
 2     extern AVOutputFormat x##_muxer; \
 3     if(CONFIG_##X##_MUXER) av_register_output_format(&x##_muxer); }
 4 #define REGISTER_DEMUXER(X,x) { \
 5     extern AVInputFormat x##_demuxer; \
 6     if(CONFIG_##X##_DEMUXER) av_register_input_format(&x##_demuxer); }
 7 #define REGISTER_MUXDEMUX(X,x)  REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)
 8 #define REGISTER_PROTOCOL(X,x) { \
 9     extern URLProtocol x##_protocol; \
10     if(CONFIG_##X##_PROTOCOL) av_register_protocol2(&x##_protocol, sizeof(x##_protocol)); }

"##" string in C language code is used for concatenating the two strings which is before and behind it  in a macros definition.
See a test code below :
1 #define DEFINE(t, x)  {t x##_##t;}
3 int main()
4 {
5     DEFINE(int, vvv);
6     return 0;
7 }

Use "gcc -E test_sharpsharp.c -o test_sharpsharp.i" command to pre-process this file
And the output file "test_sharpsharp.i" just looks like below :
1 int main()
2 {
3     {int vvv_int;};
4     return 0;
5 }

The code below is useful, and you can use "##" macro definitions to realize sample templates with C language
1 #define REGISTER_DATA_COMPARE(x)\
2     static __inline x x##_compare(x key1, x key2)\
3     {\
4         if (key1 > key2) return 1;\
5         if (key1 < key2) return -1;\
6         return 0;\
7     }
In this way, you can realize a data comparing function set, when you need comparing some type of data, just register it.

posted on 2012-06-08 10:42 Apollo Fang 阅读(276) 评论(0)  编辑 收藏 引用 所属分类: Miscellaneous


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

随笔分类

随笔档案

最新评论