C ++ условная компиляция для класса с необязательной зависимостью - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть класс Rainfall, реализация которого зависит от NetCDF , но проект должен быть компилируемым с или без NetCDF. Можно ли добиться условной компиляции без разбрызгивания директив препроцессора по всему коду? Какова лучшая практика в этой ситуации?

rainfall.hpp

#pragma once

class Rainfall {
public:
    // several constructors, methods, and destructor
private:
    // several methods and variables
};

осадков. cpp

#include "rainfall.hpp"
#include <netcdf.h>

// concrete implementation of class members

основной. cpp

#include "rainfall.hpp"
#include <stdio>
#include <cstdlib>

void main_loop();

int main(int argc, char* argv[]) {
    if (user_wants_rainfall) {
#ifndef NETCDF
        std::cerr << "Rainfall not available: project was not compiled with NetCDF\n";
        return EXIT_FAILURE;
#endif
    }

    main_loop();

    return EXIT_SUCCESS;
}

void main_loop() {
    Rainfall rainfall;
    while (t < end_time) {
        if (user_wants_rainfall) rainfall.apply_to_simulation();
        t++;
    }
}

1 Ответ

1 голос
/ 08 апреля 2020

Если вам нужен проект, который можно скомпилировать с указанной библиотекой или без нее, вам нужно иметь две реализации

rainfall_netcdf. cpp

#ifdef USE_NETCDF
#include "rainfall.hpp"
#include <netcdf.h>
//your definitions using your lib
#endif //USE_NETCDF

осадков. cpp

#ifndef USE_NETCDF
#include "rainfall.hpp"
//your definitions without your lib
#endif //USE_NETCDF

И в вашем проекте вы должны определить макрос USE_NETCDF, если вы хотите использовать эту библиотеку. Например, в Visual Studio:> Свойства> C / C ++> Препроцессор> Определения препроцессора.

...