Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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/C++;外部函数声明_C++_C - Fatal编程技术网

C++ C/C++;外部函数声明

C++ C/C++;外部函数声明,c++,c,C++,C,我目前正在编写一个C/C++共享库,计划作为另一个项目的扩展。在库中,我需要调用一些函数并访问原始代码的一些数据结构。显然,最明显的选择是包含原始代码中的头文件,让扩展的用户将路径传递到头文件并构建库。为了简化构建过程,我考虑在单独的头文件中重写所需的函数声明。这算是好的做法吗?源代码未分发的库呢?我认为他们使用相同的方法。感谢您的帮助 这算是好的做法吗 不。发送您自己的标题意味着当标题不再与library1匹配时,您不会收到任何警告。结构类型可能会获得额外的成员,函数可能会更改,例如,使用lo

我目前正在编写一个C/C++共享库,计划作为另一个项目的扩展。在库中,我需要调用一些函数并访问原始代码的一些数据结构。显然,最明显的选择是包含原始代码中的头文件,让扩展的用户将路径传递到头文件并构建库。为了简化构建过程,我考虑在单独的头文件中重写所需的函数声明。这算是好的做法吗?源代码未分发的库呢?我认为他们使用相同的方法。感谢您的帮助

这算是好的做法吗

不。发送您自己的标题意味着当标题不再与library1匹配时,您不会收到任何警告。结构类型可能会获得额外的成员,函数可能会更改,例如,使用
long
而不是像以前那样使用
int
,诸如此类的小事情不应该影响使用提供的标题的用户,但会严重影响编写自己标题的用户

唯一有意义的是,如果库承诺ABI的稳定性,那么已经编译的与旧版本库链接的第三方项目将继续工作。不过,这是个例外,不是常态

源代码未分发的库呢?我认为他们使用相同的方法

如果A链接到B,并且A是封闭源代码,那么A的作者仍然可以针对B的所有版本重新编译A

如果A链接到B,而B是封闭源代码,B通常仍会发送头文件以允许用户使用它

如果A链接到B,而B是封闭源代码,并且不提供标题,那么通常情况下,它不是为链接到B而设计的,这样做是一个非常糟糕的主意。然而,在一些罕见的情况下,这是有意义的,将B的自定义编写的标题与a一起提供可能是一个好主意


1当我写“library”时,我指的是与标题关联的产品。在插件的情况下,与头关联的产品可能通常不被称为库,但使用这些头的代码将被称为库。

您可以使用回调将主程序与库分离

例如,可以计算某些内容的库。它可能是来自 任何源,但此处是从文件读取的:

library.h

struct FooCalc_S;
typedef struct FooCalc_S FooCalc_T;
typedef int (*Callback_T)(void * extra);

FooCalc_T * FooCalc_Create(Callback_T callback, void * extra);
int FooCalc_Run(FooCalc_T * fc); // Calls callback multiple times 
main.c

#include "library.h"

int ReadFromFile(void * extra) {
    FILE * fp = extra;
    // Reads next entry from file
    return result;
}

int main(void) {
    FILE * fp = // Open file here
    FooCalc_T * fc = FooCalc_Create(ReadFromFile, fp);
    int foo = FooCalc_Run(fc);

阅读有关设计模式“回调”和“侦听器”的内容。使用C++11可能非常有用。我的问题实际上是针对不同的东西。我想知道为共享库编写自定义头文件是否合法,该文件只声明库所需的函数@hvd已经提供了一个有用的答案。对不起,我说得不够清楚。谢谢你给我这个清楚准确的回答。我假设共享库是用不同的语言编写的(例如,在与Fortran和C接口时),这也是提供自定义编写的标题有意义的罕见情况之一,对吗?@Marcel这将是一个很好的例子。对于类似的情况,我必须在Delphi中进行,当连接到用C或C++编写的库时,只提供C头文件。