2015-04-16 5 views
1

Я наткнулся на этот код, вовлеченного VARIADIC макросами, и я хотел бы знать, что это значитVARIADIC Макросы

#define DECLARE_LEGACY_TYPES(...) //This all of the macro - I am not holding out on anything 

Теперь Существует этот класс, как это

Header file: .h 
    namespace LG_Wrapper 
    { 
     template <LG_Thread Thread> 
     class EffectApplication : public ktApplication 
     { 
     public: 
     static EffectApplication<Thread>& GetInstance(); 
     protected: 
      ..... 
      ..... 
      static boost::recursive_mutex mResource; 
      } 
    } 

    DECLARE_LEGACY_TYPES(EffectApplication); <---- What does this do ? 

Я хотел бы знать, какой эффект макрос?

Update: Я получил многочисленные downvotes на этом, как этот вопрос дает от впечатления, что что-то не хватает, что я не отправлял все содержимое макроса. Макрос не больше. Хотелось бы. Этот вопрос связан с this, который был закрыт. Макрос буквально заканчивается после (...)

#define DECLARE_LEGACY_TYPES(...) 

но нет. Это одна из причин, почему я здесь, так как я не уверен, как справиться с этой ситуацией. Не действует ли этот макрос?

Дополнительная информация:

Это то, что я в другом файле Я использую следующие определенные в моей заходящего

LG_WRAPPER_EXPORTS 
LG_THREAD_NAME=GAME 

После проекта код

namespace LG_Wrapper 
{ 

enum LG_Thread 
{ 
    GAME, 
    OTHER 
}; 


/* 
If the library itself is including this file 
*/ 
#ifdef LG_WRAPPER_EXPORTS 

    #ifndef LG_THREAD_NAME 
     #error You must define LG_THREAD_NAME! 
    #endif 

    //Legacy types should not be used internally 
    #define DECLARE_LEGACY_TYPES(...) 

#else // LG_WRAPPER_EXPORTS 

    //Legacy typenames are provided for convenience to the client 
    #define DECLARE_LEGACY_TYPES(ClassType) \ 
     typedef LG_Wrapper::##ClassType##<LG_Wrapper::GAME>    ClassType; \ 

#endif // LG_WRAPPER_EXPORTS 

} 
+1

Здесь просто пропустить что-то, что стало бесполезным. –

+0

Может ли #define использоваться с "..." следующим образом? Похоже, там чего-то не хватает. – AlainD

+0

@AlainD: Да, переменные макросы. https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html Но это не распространяется на ничего. –

ответ

5

Это на самом деле довольно распространено, но это зависит от другого кода, который не упоминался в другом коде, который вы l

#if USING_OLD_COMPILER //when using an older compiler, use this to declare legacy types 
#define DECLARE_LEGACY_TYPES(...) STUFF(__VA_ARGS__)  
#else //new compiler doesn't have to do anything special 
#define DECLARE_LEGACY_TYPES(...) 
#endif 


//in older compilers we had to declare legacy types for this 
//newer compilers don't need this step, so this does nothing at all in them. 
DECLARE_LEGACY_TYPES(EffectApplication); 

Я действительно не знаю этот макрос, поэтому не знаю, что это настоящая цель. Но это часто встречается в макросах без определений для подобных трюков.

Смежные вопросы