Переключатель препроцессора, определяющий версию класса - PullRequest
0 голосов
/ 14 июля 2009

У меня есть класс с двумя возможными реализациями, в зависимости от переключателя препроцессора. Я справился с этим, создав "src \ CompSwitch1 \ class.h" и "src \ CompSwitch2 \ class.h". В моем стандартном включаемом файле я использую

   #ifdef CompSwitch1
        #include "CompSwitch1\class.h"
    #elif CompSwitch2
        #include "CompSwitch2\class.h"
    #else
        #error "Specify CompSwitch1 or CompSwitch2"
    #endif

Это работает для большинства моих классов, которым нужны две версии. Однако на одном из них я получаю ошибку компоновщика (lnk2019: неразрешенный внешний символ). Я использую MS Visual Studio 2005 и 2008, и он появляется на обоих из них.

В верхней части файла .h я проверяю параметр препроцессора. Кроме того, хотя для краткости я ссылался только на файл .h, для каждого из них также есть файл .cpp в соответствующем каталоге.

Ответы [ 4 ]

1 голос
/ 14 июля 2009

Звучит так, как будто вы включили файл заголовка для одного из классов, но связали объектный файл для другого, или ни того, ни другого

0 голосов
/ 14 июля 2009

Вы можете использовать предварительно обработанный файл cpp (этап, на котором расширяются все включения и макросы).

В VS 2008 щелкните правой кнопкой мыши ваш файл в Solution Explorer-> Properties-> C ++ -> Preprocessor и установите «Generate Preprocessed File», установите «With Numbers (/ P)». После этого снова щелкните правой кнопкой мыши свой файл и выберите «Компилировать». Файл с расширением "i") (например, main.i) будет создан в том же каталоге, где находится cpp. Откройте его и посмотрите, какой включаемый файл включен.

Этот метод очень полезен для решения сложных проблем компиляции (например, какой-то макрос из системных заголовочных файлов заменяет что-то в вашем коде).

0 голосов
/ 14 июля 2009

Попробуйте вставить в файлы реализации cpp после того, как они включают ваш заголовок, следующую строку (строки) препроцессора:

//in compswitch1.cpp
#ifndef CompSwitch1
# error "inconsistent header included"
#endif

//in compswitch2.cpp
#ifndef CompSwitch2
# error "inconsistent header included"
#endif

Если вы компилируете неправильные пары header / cpp, вы должны получить как минимум ошибки компиляции, а не ссылки ошибок. Там гораздо проще идентифицировать / исправить;)

Другая возможность состоит в том, что cpp-файлы вообще не включены в компиляцию. Поместите прагму сообщения в файл cpp, чтобы посмотреть, скомпилированы ли они вообще:

#pragma message( "Compiling " __FILE__ ) 

Или попробуйте определить в каталоге сборки, созданы ли объектные файлы, относящиеся к модулям компиляции cpp.

Надеюсь, это поможет,
Ованес

0 голосов
/ 14 июля 2009

это действительно должно быть #ELIF DEFINED (CompSwitch2) действительно. В противном случае вы предполагаете, что "CompSwitch2" был определен со значением 1 ...

...