title: How to make GCC reduce 'arg,##__VA_ARGS__' to 'arg' to use it as single macro argument?
body: <p>I have these macros defined for visual studio and clang and they both compile fine</p>
  
  <pre><code>#if defined(_MSC_VER)
  #   define _declare_func(...) PP_CAT(PP_CAT(_declare_func_, PP_NARG(__VA_ARGS__)),(__VA_ARGS__))
  #   define declare_func(...) _declare_func PP_LEFT_PAREN notused,##__VA_ARGS__ PP_RIGHT_PAREN
  #else // clang version
  #   define _declare_func(...) PP_CAT(_declare_func_, PP_NARG(__VA_ARGS__))(__VA_ARGS__)
  #   define declare_func(...) _declare_func ( notused,##__VA_ARGS__ )
  #endif
  
  #define _declare_func_1(notused)               void my_function()
  #define _declare_func_2(notused, scope)        void scope::my_function()
  
  class MyClass 
  {
      declare_func();
  };
  
  declare_func(MyClass) { }
  </code></pre>
  
  <p>PP_CAT is a classic multilevel concat macro</p>
  
  <p>PP_NARG counts the number of macro arguments</p>
  
  <p>PP_LEFT_PAREN and PP_RIGHT_PAREN reduce to '(' and ')'</p>
  
  <p>Is there any way to achieve this with GCC ? ( I tried both macro version with GCC 5.2, both fail to compile because the comma seem to be propagated during macro resolution and removed only at the end of preprocessing, making PP_NARG always reduce to '2' and never '1')</p>
  
  <p>Thanks !</p>