在 C 头文件中声明变量

Declaring variable in C header

我想在 C 中包含一个在外部文件中声明的变量。

我的项目结构是这样的。

foo.h
foo.c
variable.c
main.c

我现在正在做的是

/* main.c */

#include "foo.h"

#include <stdio.h>
#include <stdlib.h>


int main() {
    bar();
    printf("%d\n", a);
    return 0;
}

/* foo.h */

#ifndef FOO_H
#define FOO_H

#include "variable.c"

extern const int a;
extern const int b[];


int bar();
#endif

/* foo.c */

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

int bar () {
    printf("tururu\n");
    printf("%d\n", b[0]);
    return 0;
}

/* variable.c */

const int a = 2;
const int b[3] = {1, 2, 3};

我要这样定义的变量是常量(只读)。

我事先不知道数组的大小,这取决于variable.c中的定义。

所以我的问题是:

谢谢

编辑:我已经用一个可以测试的例子更新了我的代码。此代码未编译,因为它表示 'b' 在函数栏中未声明。如果我注释掉 bar 中的 printf,它会编译并 运行。所以变量可以被 main 看到但不能被 foo.c?

EDIT2:以这种方式包含的变量是只读的。我更新了代码并在 foo.c 中添加了 foo.h 的包含,现在编译器告诉我 'a' 和 'b'

有多个定义

EDIT3:清理代码和试图更清楚的问题。

在头文件中声明变量并在c文件定义

是一个很好的做法

更多详情:Variable Definition vs Declaration

在你的variable.h中,你只需定义两个变量

所以,这不是正确的方法

另外数组相关的代码没有错,可以放在一个.c文件里

变量必须在c文件中定义,而在头文件中可以放置外部引用

/* foo.h */
#ifndef FOO_H
#define FOO_H

#include "variable.h"

extern int a;
extern int b[];

#endif

/* foo.c */

int a = 2;
int b[3] = {1, 2, 3};

foo.h 中删除 #include "variable.c",您的代码应该可以工作。

您基本上是在使用 extern 告诉您的编译器,无论您在 extern 关键字之后的声明中使用什么,都将在单独链接的另一个 .c 源文件中定义。在你的例子中,这个 .c 文件是 variable.c.

是的,千万不要 #include .c 文件。这很容易导致链接器失控。