gpt4 book ai didi

c++ - 如何根据预处理器定义的宏关闭 C++ 库的子模块

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:07 25 4
gpt4 key购买 nike

我在做什么 我正在编写一个依赖于 NetCDF 库的 C++ 库。例如,

include <netcdf>
class myLib {
public:

myLib();
myLib(const myLib&);
virtual ~myLib();

std::string probe_data(std::string & file_path);
...

probe_data函数使用NetCDF库中的函数。

有什么问题 我已经定义了一个预处理器宏 CANALOGSIO_WITHOUT_NETCDF。因为在某些系统中,没有安装 NetCDF 库。所以我想在我的库中关闭这个功能,例如,库仍然有 probe_data 功能,但它只是返回 NetCDF not installed

这样做的好做法是什么?谢谢!

最佳答案

我将列出我想到的 2 种不同的方法。

1、在函数定义中使用ifdefs即可。这将保持统一的接口(interface),每个人都可以调用它。

class myLib {

...
std::string probe_data(std::string & file_path) {
#ifdef NETCDF
return do_real_probe(file_pat);
#else
cerr << "NOt implemented function" << endl;
return "";
#endif
}

...

这需要为单独的系统单独编译。您需要在编译命令行中提供宏的定义,即使用 gcc:

g++ -DNETCDF ..
  1. 第二种方法将基于图书馆方法。您可以为不同的系统编译单独的实现库。然后在链接时,您可以选择要使用的静态库(或在运行时选择动态库)。很可能你只会交付在目标系统上工作的库,什么都不会。如果你选择的话,你可能不用 #ifdefs 就可以逃脱,只是在不同的文件中有不同的实现>

系统1.cpp

 string probe(string &) { return do_probe();}
gcc sys1.cpp -o sys1.so -shared

系统2.cpp

 string probe(string &) {cerr << messate; return "";}
gcc sys2.cpp -o sys2.so -shared

现在您只需将正确的库(sys1 或 sys2)传送到正确的系统。或您程序的正确静态链接图像。

有多种方法可以使用条件编译来做到这一点。所以你决定。

关于c++ - 如何根据预处理器定义的宏关闭 C++ 库的子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45038192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com