Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何关闭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 - Fatal编程技术网

如何关闭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
     }

    ...
  • 第二种方法基于库方法。您可以为不同的系统编译单独的实现库。然后在链接时您可以选择使用哪个静态库(或者在运行时选择动态库)。最有可能的情况是,您只提供在目标系统上工作的库,而不会提供任何内容。您可能不需要#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
    

    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和类的多个声明。因此,请使用指针引用。我不确定我是否完全理解您的注释。即使我使用成员或作为值传递,如果它们不会被使用,请参阅在这里,我仍然可以为它们做一个转发声明,对吗?谢谢。如果你把一个结构作为一个值传递,你需要在代码中的某个地方完全定义它。如果你把它作为一个指针传递,并且不在函数中使用它的成员,你可以这样做