gpt4 book ai didi

C : Including a source file instead of a header

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

我是库链接的初学者,我花了两天时间尝试将 libcrypto 库链接到我在 Visual Studio 2017 上的 C 程序.
我不得不包含 applink.c 来解决我的问题。但我认为包含不是标题的东西是很奇怪的。在互联网上搜索了一下之后,我了解到包含源文件是存在的,但应该避免这样做。为什么 openssl library 没有?

我不认为它特别相关,但这里是这个源文件的一个小概述,你可以找到整个源文件 here .

#define APPLINK_OPEN    18      /* formally can't be used, as flags can vary */
#define APPLINK_READ 19
#define APPLINK_WRITE 20
#define APPLINK_LSEEK 21
#define APPLINK_CLOSE 22
#define APPLINK_MAX 22 /* always same as last macro */

#ifndef APPMACROS_ONLY
# include <stdio.h>
# include <io.h>
# include <fcntl.h>

static void *app_stdin(void)
{
return stdin;
}

static void *app_stdout(void)
{
return stdout;
}

if (once) {
OPENSSL_ApplinkTable[APPLINK_STDIN] = app_stdin;
OPENSSL_ApplinkTable[APPLINK_STDOUT] = app_stdout;
OPENSSL_ApplinkTable[APPLINK_STDERR] = app_stderr;
OPENSSL_ApplinkTable[APPLINK_FPRINTF] = fprintf;
OPENSSL_ApplinkTable[APPLINK_FGETS] = fgets;
OPENSSL_ApplinkTable[APPLINK_FREAD] = fread;
OPENSSL_ApplinkTable[APPLINK_FWRITE] = fwrite;
OPENSSL_ApplinkTable[APPLINK_FSETMOD] = app_fsetmod;
OPENSSL_ApplinkTable[APPLINK_FEOF] = app_feof;
OPENSSL_ApplinkTable[APPLINK_FCLOSE] = fclose;

OPENSSL_ApplinkTable[APPLINK_FOPEN] = fopen;
OPENSSL_ApplinkTable[APPLINK_FSEEK] = fseek;
OPENSSL_ApplinkTable[APPLINK_FTELL] = ftell;
OPENSSL_ApplinkTable[APPLINK_FFLUSH] = fflush;
OPENSSL_ApplinkTable[APPLINK_FERROR] = app_ferror;
OPENSSL_ApplinkTable[APPLINK_CLEARERR] = app_clearerr;
OPENSSL_ApplinkTable[APPLINK_FILENO] = app_fileno;

OPENSSL_ApplinkTable[APPLINK_OPEN] = _open;
OPENSSL_ApplinkTable[APPLINK_READ] = _read;
OPENSSL_ApplinkTable[APPLINK_WRITE] = _write;
OPENSSL_ApplinkTable[APPLINK_LSEEK] = _lseek;
OPENSSL_ApplinkTable[APPLINK_CLOSE] = _close;

once = 0;
}

包含头文件和源文件有什么区别?这样做的优缺点是什么?

这篇文章并不是在寻求解决链接问题的方法

最佳答案

包含文件就像将文件复制到 C 文件中一样。

这意味着任何包含 C 文件的内容都将在 applink.c 中拥有自己的函数副本。您还会注意到它们被声明为“静态”,这意味着这些副本是它们各自文件的本地副本,并且不会产生冲突。它们甚至可能是内联的。

一般来说,一方面是二进制大小和编译时间,另一方面是运行时速度和代码简单性之间的权衡。

这不是什么稀罕事,更让我吃惊的是它是 .c 而不是 .h。

关于C : Including a source file instead of a header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44309386/

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