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.