gpt4 book ai didi

c - C中的程序如何访问头文件中声明的函数

转载 作者:行者123 更新时间:2023-12-02 08:32:30 26 4
gpt4 key购买 nike

ma​​infile.c、helper.chelper.h. 三个文件在同一个目录下。 helper.h 包含 foo1foo2 的函数原型(prototype),一个 struct 声明和一些 typedefs

header.h 包含在 helper.cmainfile.c 中(helper.h也有包括守卫,所以双重声明不是问题。)。 foo1foo2 函数在 helper.c

中定义

如果我在任何 .c 文件中包含 helper.h,我的理解是 helper.h 的内容是按字面意思粘贴的(逐字逐句)在 .c 文件中运行。我的理解正确吗?

我曾经认为,如果我在 mainfile.c 中调用 foo1,控制权就会转移到 foo1 的开头,而那个 foo1 无法与 helper.c 中定义的任何其他内容进行交互。但是这种思路有问题,因为当我在 helper.c 中声明一个全局变量时,两个函数都可以访问它。那么当 mainfile.c 调用 foo1foo2 时会发生什么?

我对静态存储类的理解是将局部变量转换为全局变量,因为所有函数都可以访问它。因此,如果我在 foo1 中声明一个静态数组,然后在 mainfile.c 中调用 foo2foo2 是否能够访问这个静态数组?

dictionary.c的内容应该是这样的

void foo1 (void)
{
static int array[10] = {1,2,3,4,5,6,7,8,9,10}
//more code
}

void foo2 (void)
{
array[7] = 4;
// more code
}

当从 mainfile 调用 foo2 时,它是否能够访问静态数组。

最佳答案

两者都是 mainfile.chelper.c是单独的翻译单元,产生单独的目标文件(受链接器影响)。您可以单独编译它们并生成一个插图 .o文件(或 Windows 平台上的 .obj):

gcc -c helper.c
gcc -c mainfile.c

然后检查它们的符号,例如通过 nm命令。为了链接它们,请使用以下内容:

gcc helper.o mainfile.o

foo1mainfile.c 调用, 该函数可以访问它自己的“全局变量”(在 helper.c 中定义)并且该变量是否具有内部或外部链接 并不重要(请注意局部变量没有链接).真实的是 mainfile.c只有当此类变量具有外部链接(它在任何函数之外定义并且没有 foo1 存储类)时,才可能(直接)访问它(即,在 static 函数旁边)。这也需要适当的声明,建议的方法是在helper.h中声明。使用 extern存储类,没有初始化器,例如:

extern int global_variable;

请注意,这会根据定义检查声明(因为您在 "helper.h" 源文件中包含 helper.c header )。

更新:

正如@jweyrich 所指出的,有可能“绕过”全局变量的内部链接,因此它(及其地址)可用于“消费者”文件源。这是一个简短的例子:

b.h :

int *get_secret(void);

b.c :

#include "b.h"

static int secret = 999;

int *get_secret(void) {
return &secret;
}

a.c :

#include <stdio.h>
#include "b.h"

int main(void)
{
int *a;

a = get_secret();
printf("%d\n", *a);

return 0;
}

甚至secret全局变量具有内部链接(因为它具有 static 存储类),可以在 a.c 中访问它.当某些函数返回用 static 声明的函数的指针时,同样的技术适用于函数。 .

关于c - C中的程序如何访问头文件中声明的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25119081/

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