如何关闭C+的子模块+;基于预处理器定义宏的库 >强>我正在编写一个C++代码库,它依赖于 NETCDF< /COD>库。比如说, include <netcdf> class myLib { public: myLib(); myLib(const myLib&); virtual ~myLib(); std::string probe_data(std::string & file_path); ... 包括 myLib类{ 公众: myLib(); myLib(const myLib&); 虚拟~myLib(); std::字符串探测数据(std::字符串和文件路径); ...
函数如何关闭C+的子模块+;基于预处理器定义宏的库 >强>我正在编写一个C++代码库,它依赖于 NETCDF< /COD>库。比如说, include <netcdf> class myLib { public: myLib(); myLib(const myLib&); virtual ~myLib(); std::string probe_data(std::string & file_path); ... 包括 myLib类{ 公众: myLib(); myLib(const myLib&); 虚拟~myLib(); std::字符串探测数据(std::字符串和文件路径); ...,c++,cmake,macros,c-preprocessor,C++,Cmake,Macros,C Preprocessor,函数probe_data使用NetCDF库中的函数 问题出在哪里我已经定义了一个预处理器宏CANALOGSIO\u而没有_NETCDF。因为在某些系统中,没有安装NETCDF库。因此我想在我的库中关闭此功能,例如,库仍然具有探测数据功能,但它只是返回NetCDF未安装 这样做的好方法是什么?谢谢!我将列出我想到的两种不同方法 1,只需在函数定义中使用ifdef。这将保持统一的接口,每个人都可以调用它 class myLib { ... std::string probe_dat
probe_data
使用NetCDF
库中的函数
问题出在哪里我已经定义了一个预处理器宏CANALOGSIO\u而没有_NETCDF
。因为在某些系统中,没有安装NETCDF
库。因此我想在我的库中关闭此功能,例如,库仍然具有探测数据
功能,但它只是返回NetCDF未安装
这样做的好方法是什么?谢谢!我将列出我想到的两种不同方法 1,只需在函数定义中使用ifdef。这将保持统一的接口,每个人都可以调用它
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
}
...
string probe(string &) { return do_probe();}
gcc sys1.cpp -o sys1.so -shared
sys2.cpp
string probe(string &) {cerr << messate; return "";}
gcc sys2.cpp -o sys2.so -shared
stringprobe(string&){cerr我将列出我想到的两种不同的方法
1,只需在函数定义中使用ifdef。这将保持统一的接口,每个人都可以调用它
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
}
...
第二种方法基于库方法。您可以为不同的系统编译单独的实现库。然后在链接时您可以选择使用哪个静态库(或者在运行时选择动态库)。最有可能的情况是,您只提供在目标系统上工作的库,而不会提供任何内容。您可能不需要#ifdef,如果您选择这样做,只需在不同的文件中使用不同的实现即可>
sys1.cpp
string probe(string &) { return do_probe();}
gcc sys1.cpp -o sys1.so -shared
sys2.cpp
string probe(string &) {cerr << messate; return "";}
gcc sys2.cpp -o sys2.so -shared
字符串探测(字符串&){cerr如果#ifdef NETCDF do probe#endif
那么cc-DNETCDF
谢谢您的输入。这样,如果NETCDF
没有定义,就不会有probe_data
函数。但是,如果其他程序调用此函数,它会给出一个错误。我希望在没有时仍然有此函数de>NETCDF
存在,但它只是打印出一条警告消息。当然有更好的解决方案,但您可以创建两个仅标题的库,一个具有依赖NETCDF的函数,另一个仅打印警告。然后,您可以使用建议的构造使用其中一个或另一个进行编译。#ifdef NETCFG do probe#e print messag#endif
如果Def NETCDF do probe#endif
那么cc-DNETCDF
谢谢您的输入。这样,如果未定义NETCDF
,就不会有probe\u data
函数。但是,如果其他程序调用此函数,它会给出一个错误。我希望仍然有此功能当不存在NETCDF
时,函数的作用是,但它只是打印一条警告消息。当然有更好的解决方案,但您可以创建两个只包含标题的库,一个包含依赖NETCDF的函数,另一个只打印警告。然后,您可以使用建议的构造使用其中一个或另一个进行编译。\ifdef NETCFG do probe#else print messag#endif
这是一个后续问题。在您的第二个解决方案中,如果我库中的某些函数采用netcdf类型的参数,那么当系统中没有netcdf时,我该如何处理此函数声明?谢谢。如果这是指针或引用类型,您可以使用前向声明在一个公共头文件中,只需在那里添加类netcdf;
。但是,如果您将其作为值传递,或者在程序的其他部分使用其成员,这将变得很难看,并且需要ifdef和类的多个声明。因此,请使用指针引用。我不确定我是否完全理解您的注释。即使我使用了成员或作为值传递,如果它们不会在其他地方使用,我仍然可以为它们做一个正向声明,对吗?谢谢。如果你将结构作为值传递,你需要在代码中的某个地方完全定义它。如果你将它作为指针传递,并且不在函数中使用它的成员,你不必定义struct,只需定义一个指向str的指针即可uct
,因此,如果函数的虚拟实现没有引用结构/类的任何成员,“forward”声明足以定义指向它的指针类型。struct mystruct;void myfunction(mystruct*){dose here}
关于此问题的后续问题。在您的第二个解决方案中,如果我库中的某些函数采用netcdf类型的参数,那么当系统中没有netcdf时,我该如何处理此函数声明?谢谢。如果这是指针或引用类型,您可以在公共头文件中使用前向声明,只需添加cla即可ss netcdf;
在那里。但是,如果您将其作为值传递,或者在程序的其他部分使用其成员,这将变得很难看,并且将需要ifdef和类的多个声明。因此,请使用指针引用。我不确定我是否完全理解您的注释。即使我使用成员或作为值传递,如果它们不会被使用,请参阅在这里,我仍然可以为它们做一个转发声明,对吗?谢谢。如果你把一个结构作为一个值传递,你需要在代码中的某个地方完全定义它。如果你把它作为一个指针传递,并且不在函数中使用它的成员,你可以这样做