Как применить одно определение? - PullRequest
1 голос
/ 10 июня 2009

Учитывая проект C , который должен поддерживать несколько сред, как мне использовать препроцессор для обеспечения определения именно одной среды?

Я уже могу сделать:

    #if defined PROJA
    (blah blah blah)
    #elif defined PROJB
    (etc)
    #else
    #error "No project defined"
    #endif

Все, что делает, это говорит мне, если определены 0 проектов. Если какая-то полезная душа определяет и проект A, и проект B, препроцессор примет только проект A. Однако, с моей точки зрения, правильное поведение - помечать ошибку.

Конечно, только с двумя определенными проектами эта проблема тривиальна. Как мне решить с 200?

Ответы [ 6 ]

3 голосов
/ 10 июня 2009

как то так:

#if defined PROJA
  #ifdef HAVE_PROJ
    #error 
  #endif

  #define HAVE_PROJ
#endif

#if defined PROJB
  #ifdef HAVE_PROJ
    #error 
  #endif

  #define HAVE_PROJ
#endif

#ifndef HAVE_PROJ
  #error No project selected (you need to define PROJA, PROJB, or ...)
#endif
2 голосов
/ 10 июня 2009
#if defined PROJA
bool one_project_defined = true;
#endif

#if defined PROJB
bool one_project_defined = true;
#endif

#if defined PROJC
bool one_project_defined = true;
#endif

#if defined PROJD
bool one_project_defined = true;
#endif

one_project_defined; // Won't compile in wrong builds
2 голосов
/ 10 июня 2009

Попробуйте это

#define ENV_UNKNOWN 0
#define ENV_MACOSX  1
#define ENV_LINUX   2
#define ENV_WIN32   3
/* and so on */


#ifndef ENVIRONMENT
/* no environment given, default to something (perhaps) */
#define ENVIRONMENT ENV_UNKNOWN
#endif

/* and now the environment specific parts */
#if (ENVIRONMENT == ENV_MACOSX)
#include "macosx_port.h"
#endif

#if (ENVIRONMENT == ENV_LINUX)
#include "linux_port.h"
#endif

#if (ENVIRONMENT == ENV_WIN32)
#include "win32_port.h"
#endif

#if (ENVIRONMENT == ENV_UNKNOWN)
#error You have to specify the ENVIRONMENT.
#endif

Теперь вы можете указать среду, для которой вы хотите скомпилировать, в командной строке, например:

cc -DENVIRONMENT=2 ...

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

2 голосов
/ 10 июня 2009

Может иметь разные файлы

include_proja.h
include_projc.h

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

Такие вещи - это то, что системы сборки для . Если вы делаете что-то странное с макросами ... найдите лучший выход за пределы исходного кода.

Каждый файл может сделать (извините за многословие здесь)

#define A_PROJECT_INCLUDE_WAS_INCLUDED

А потом

#ifndef A_PROJECT_INCLUDE_WAS_INCLUDED
    #error "No project include"
#endif

Но некоторые пропущенные символы все равно сломают его.

Удачи

0 голосов
/ 10 июня 2009

возможно, вы можете сделать что-то вроде:

#if PROJ==A
(blah blah blah)
#elif PROJ==B
(etc)
#else
#error "No project defined"
#endif
0 голосов
/ 10 июня 2009

Проблема с вложенными ifs заключается в том, что у вас будет n ^ 2 разных тестов для n проектов.

Вам просто нужно какое-то выражение, которое в этом случае выдаст ошибку времени компиляции. Может быть:

#ifdef PROJA
#define PROJA-TEST "
#else
#define PROJA-TEST ""
#endif

и т. Д. Для B, C и т. Д.

Тогда:

const char *test_only_one_project = PROJA-TEST PROJB-TEST PROJC-TEST " "More than one project is defined!";

РЕДАКТИРОВАТЬ: ... конечно, это только проверяет, что определено нечетное количество проектов. Но это должно работать:

#ifdef PROJA
#define PROJA-TEST (
#endif

и так далее, затем

const char *test_only_one_project = PROJA-TEST PROJB-TEST PROJC-TEST "More than one project is defined!" );
...