2013-05-29 4 views
5

Я читаю исходный код leveldb, esp. относительно mutexlock.Зачем использовать макрос в объявлении класса

Я нашел это заявление:

class SCOPED_LOCKABLE MutexLock { 
public: 
    explicit MutexLock(port::Mutex *mu) EXCLUSIVE_LOCK_FUNCTION(mu) 
     : mu_(mu) { 
    this->mu_->Lock(); 
    } 
    ~MutexLock() UNLOCK_FUNCTION() { this->mu_->Unlock(); } 

private: 
    port::Mutex *const mu_; 
    // No copying allowed 
    MutexLock(const MutexLock&); 
    void operator=(const MutexLock&); 
}; 

и я обнаружил, что SCOPED_LOCKABLE определяется как пустой, так зачем использовать его в объявлении класса?

+1

Я думаю, что с некоторой конфигурацией, макро конец (см. http://gperftools.googlecode.com/svn-history/r99/trunk/src/base/thread_annotations.h) –

+0

FYI: Код из открытого проекта проекта Googleddd: https: // github.com/google/leveldb/blob/77948e 7eec0613fb5cbecb7e320b9498607030b5/Util/mutexlock.h –

ответ

1

Это может быть определено как нечто иное в другой среде. Иногда это может повлиять на связь.

Он также может указывать на необходимость включения других заголовков для правильной настройки заголовков библиотек.

2

В определениях классов или функций, если разработчику необходимо приложить дополнительную характеристику, он использует MACROS, чем жесткое кодирование в каждом определении классов или функций. Это хорошая практика для программирования. потому что в один прекрасный день, если вам нужно изменить эту характеристику, вам нужно изменить только одно место, не везде.

Некоторые использование макросов в определении класса

#ifdef CONTROLLER_EXPORTS 
    #define CONTROLLER_API __declspec(dllexport) 
#else 
    #define CONTROLLER_API __declspec(dllimport) 
#endif 

class CONTROLLER_API CConfiguration{ 
} ; 

Вы можете получить еще несколько окон, связанных полезные подсказки здесь. http://msdn.microsoft.com/en-us/library/dabb5z75(v=vs.80).aspx

Даже вы можете использовать модификаторы доступа так же, как это, потому что некоторое время для тестирования вам может потребоваться временно изменить уровень доступа.

#define PRIVATE private 
#define PUBLIC public 

class A{ 
PRIVATE: 
    int m_a; 
PUBLIC: 
    int m_b; 
} 

Тогда какая именно проблема? это может быть любая полезная характеристика, как указано выше. вот один пример я получил от мерзавца

#define SCOPED_LOCKABLE  __attribute__ ((scoped_lockable)) 
  • Для получения подробной информации о __attribute__ проверки here
  • Для источника я получил выше проверки кода here
Смежные вопросы