C ++ макрос "если класс определен" - PullRequest
9 голосов
/ 20 апреля 2010

Есть ли такой макрос в C ++ (кросс-компилятор или специфичный для компилятора):

#if isclass(NameSpace::MyClass)

Было бы полезно.

Ответы [ 5 ]

10 голосов
/ 20 апреля 2010

Нет. Директивы препроцессора и макросы оцениваются препроцессором, который завершает свои задачи, прежде чем код будет проанализирован как C ++. Препроцессор не знает классов или пространств имен.

8 голосов
/ 20 апреля 2010

Если вас не волнует переносимость, оператор __ if_exists в VC ++ отвечает вашим потребностям.

5 голосов
/ 20 апреля 2010

Это невозможно, но вы можете использовать константу include guard , чтобы убедиться, что класс включен.

5 голосов
/ 20 апреля 2010

На этапе предварительной обработки такого нет, поэтому нет макроса.

Однако вы можете взглянуть на черты типа is_class , доступные в Boost или в C ++ 0x, которые позволяют принимать решения во время компиляции.

2 голосов
/ 20 апреля 2010

Мне кажется, что было бы лучше проверить, был ли еще включен заголовочный файл с определением класса, которое вы ищете, вместо того, чтобы пытаться увидеть, существует ли класс. Это действительно легко проверить, если вы внедрили стандарт определения символа для каждого заголовочного файла, как показано:

// myfile.h

#ifndef _MYFILE_H_
#define _MYFILE_H_

// CODE

#endif // _MYFILE_H_

Тем не менее, лучше всего убедиться, что ваши заголовочные файлы включены в правильном порядке. Самый простой способ сделать это - иметь «общий» заголовочный файл, который, в свою очередь, включает все заголовки, которые вам понадобятся в правильном порядке. Просто включите это в каждый из исходных файлов вашего проекта, и все будет хорошо. Это не обязательно лучшее решение, но это самое простое.

...