在C头中声明变量

时间:2015-01-26 10:58:09

标签: c arrays header-files

我想在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中的定义。

所以我的问题是:

  • 这是从外部来源包含一些常量变量的正确方法吗?

  • 如果是的话,我做错了什么以及如何解决?

谢谢

编辑:我已经用可以测试的示例更新了我的代码。此代码未编译,因为它表示&#39; b&#39;在功能栏中未声明。如果我在栏中注释掉printf,它会编译并运行。所以变量可以通过main看到,但不能通过foo.c看到?

EDIT2:这种方式包含的变量是只读的。我已经更新了代码并在foo.c中添加了foo.h的包含,现在编译器告诉我们有多个定义了&#39; a&#39;和&#39; b&#39;

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

3 个答案:

答案 0 :(得分:2)

必须在c文件中定义变量,而在标题中可以放置extern引用

/* 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};

答案 1 :(得分:2)

#include "variable.c"移除foo.h,您的代码应该有效。

您基本上使用extern告诉您的编译器,在extern关键字之后的声明中使用的任何内容都将在另一个单独链接的.c源文件中定义。在您的情况下,此.c文件为variable.c

是的,请注意永远不要#include .c文件。这很容易导致链接器变得混乱。

答案 2 :(得分:1)

最好在头文件中声明变量,在c文件中定义

更多细节:Variable Definition vs Declaration

variable.h中,您只需定义两个变量

所以,这不是正确的方式

除了与数组相关的代码没有错,你可以把它放在.c文件中