【问题标题】:Declaring variable in C header在 C 头文件中声明变量
【发布时间】:2015-01-26 10:58:08
【问题描述】:

我想在 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;
}

/* 变量.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:清理代码和试图更清楚的问题。

【问题讨论】:

  • 我在写我的问题之前已经阅读过,但它没有回答我的问题。我的问题是我无法在 foo.c 中定义和初始化我的变量,我需要在外部文件中定义和初始化变量,并且在那个问题中没有观察到这个问题。但是感谢您的链接,这是一个非常有用的答案。
  • 我也更新了问题以明确差异。
  • foo.c 需要包含 foo.h(使声明可见),foo.h 不应包含 variable.h,并且在大多数情况下,定义不会进入标题(此标题必须如果定义了变量,则不会被多个文件包含)。
  • 问题 1:从不在 h 文件中声明或定义非常量变量没有任何意义。问题 2:从不 使用全局变量没有任何意义。相反,使用文件范围静态变量和 setter/getter,as demonstrated here。问题 3:您的程序设计从根本上被破坏,需要从头开始重新制作:像您一样分配变量没有任何意义。

标签: c arrays header-files


【解决方案1】:

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

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

是的,请注意不要使用 #include .c 文件。这很容易导致链接器出现问题。

【讨论】:

  • variable.c 还应该包含 foo.h 以便编译器可以捕获类型不匹配。
  • @mafso:是的,我没有注意到 OP 最初并没有这样做 =)
【解决方案2】:

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

/* 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.c 中定义变量,我需要从外部文件中定义。
【解决方案3】:

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

更多详情:Variable Definition vs Declaration

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

所以,这不是正确的方法

除了数组相关的代码没有错,可以放到.c文件中

【讨论】:

  • 除非变量是常量(只读),否则在头文件中声明它是非常糟糕的做法。不要使用全局变量。
猜你喜欢
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 2010-11-12
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多