What is "##" string in C code

What is "##" string in C code

See code below( quoting ffmpeg source code )
 1  #define  REGISTER_MUXER(X,x) { \
 2       e xtern  AVOutputFormat x##_muxer; \
 3       i f (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.

你可能感兴趣的:(What is "##" string in C code)