C:包含源文件而不是标头

时间:2017-06-01 13:49:22

标签: c dll header include

我是库链接的初学者,并花了两天时间尝试将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;
}

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

这篇文章并没有要求解决链接问题的方法

1 个答案:

答案 0 :(得分:-1)

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

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

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

这不是一件罕见的事情,让我感到惊讶的是它的.c而不是.h。