использование препроцессорных директив для общего файла

У меня есть файл .cpp (назовем его check.cpp) со следующей директивой препроцессора:

#ifdef CHECK
// code to execute goes here
#endif

Файл check.cpp используется в двух разных проектах. (Проекты находятся в одной папке и используют один и тот же файл check.cpp, который также находится в той же папке)

Я хочу, чтобы один проект выполнял этот код, а другой проект не выполнял этот код.

Итак, в итоге для ProjectA check.cpp будет иметь:

#ifdef CHECK
// This code WILL execute
#endif

А для ProjectB check.cpp будет иметь:

#ifdef CHECK
// This code WILL NOT execute
#endif

Возможно ли это с помощью директив препроцессора, или, может быть, есть более простой способ?

Моя идея заключалась в том, чтобы использовать

#define CHECK 1

И поместите это в один из проектов, а не в другой, но файл .cpp должен включать #define, чтобы он работал, и этот файл является общим ...

Любые идеи?


person ryrich    schedule 26.02.2013    source источник
comment
Вы можете добавить -DCHECK в команду компиляции (например, gcc -DCHECK) в один make-файл и оставить его вне команды компиляции в другом.   -  person paulsm4    schedule 26.02.2013


Ответы (4)


Я не уверен, какой компилятор вы используете, но в Visual Studio определите CHECK в проекте, для которого вы хотите выполнить код:

Настройки проекта> Свойства конфигурации> C / C ++> Препроцессор> Определения препроцессора

person JBentley    schedule 26.02.2013
comment
Да, я использую VS2010 Ultimate. Это отлично работает, как раз то, что мне нужно. огромное спасибо! - person ryrich; 26.02.2013

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

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

person SomeWittyUsername    schedule 26.02.2013
comment
Я согласен. разделение на 2 разных файла чище, но, к сожалению, на данный момент я должен поделиться файлом в моем приложении :( - person ryrich; 26.02.2013

Я не думаю, что это возможно.

#ifdef CHECK
...
#endif

Всегда будет выполняться, если определена функция CHECK. Единственный способ не включать вложенный код в проект - это отменить определение CHECK для этого проекта, если он когда-либо был определен.

#undef CHECK

в проекте B

person SNce    schedule 26.02.2013

Если вы хотите использовать свой подход с использованием #defines, я бы предложил следующий подход:

#ifdef FOO
#define BAR(x) f(x)
#undef FOO
#else
#define BAR(x) g(x)
#endif

И в ProjectA.cpp:

#define FOO
#include "header.h"

void a(int x) {
    BAR(x); // f(x)
}

В ProjectB.cpp

#undef FOO
#include "header.h"  
void b(int x) {
    BAR(x); // g(x)
}

Это вызовет две версии разных функций, но ваш код может остаться в одном файле common.cpp. Таким образом, в g(x) вы можете запустить код, специфичный для ProjectB.cpp, а в f(x) вы можете запустить код, специфичный для ProjectA.cpp

Надеюсь, я правильно ответил на вопрос.

person askmish    schedule 26.02.2013