我在哪里可以在c程序中声明全局变量,无论是在头文件还是源文件中

时间:2016-04-15 04:38:26

标签: c global-variables

您好我是C ++开发人员,现在正在进行C编程。

我的问题是哪个地方更适合在c程序中声明全局变量。 标题或源文件(假设我的全局变量未在其他文件中使用)?

我希望这个变量像C ++中的私有变量一样。

6 个答案:

答案 0 :(得分:2)

哪个地方最好在c程序中声明一个全局变量

答案:在源(*。c)文件中。

假设场景如此,我在头文件中声明了一个变量。我将此标头包含在两个不同的.c文件中。在编译的宏扩展步骤之后,这两个文件将具有相同名称的全局变量。所以它会在链接时间内抛出一个错误,比如变量的多个声明。

结论: -

在.c文件中保留所有全局变量声明,如果在其他文件中不需要,则将其设置为eval

如果需要从其他文件访问,请在相应的头文件中添加static变量声明

答案 1 :(得分:2)

假设您的变量是全局且非静态的。

您需要在头文件中声明它。我们使用rowAdapter = new RowAdapter(MainActivity.this, R.layout.weather_item, data); listv.setAdapter(rowAdapter); 关键字。正如评论中所指出的,这个关键字不是必需的,但大多数C用户更喜欢在标题中使用它,这是一种约定。

stackoverflow.h:

extern

并在源文件中初始化它。 (如果要提供初始化值,则禁止使用关键字#ifndef STACHOVERFLOW_H #define STACHOVERFLOW_H extern int my_var; #ifndef

stackoverflow.c

extern

不要在标头中放置初始化值,否则如果标头至少使用两次,则会出现链接器错误。

现在,您可以通过包含标题在任何其他模块中使用您的变量。

的main.c

#include "stackoverflow.h"

int my_var = 50;

在“stackoverflow.c”中包含标题“stackoverflow.h”是一种确保源文件中的定义匹配头文件中的声明的方法。这允许在编译时出现错误,而不是有时会出现神秘的链接器错误。

编辑:这并不是使变量“私有”的方式。您必须使用静态变量使其“私有”。见R Sahu's answer

答案 2 :(得分:2)

您不应将全局非常量变量放在任何位置。使用extern声明的全局,可用于整个项目。需要这样做总是源于糟糕的程序设计,时期。这对C和C ++都是如此。

例外是const个变量,可以很好地分享多个文件。

如果您需要文件范围变量,则应在.c文件中声明它们,并始终为static。不要把这些混淆为"全局"因为它们是声明它们的翻译单元的本地。 More info about how static file scope variables can make sense

另请注意C标准的未来语言方向:

  

在没有文件范围的情况下声明具有内部链接的标识符   静态存储类说明符是一个过时的功能。

因此,如果您不使用static,您的代码可能无法在下一版本的C标准中编译。

答案 3 :(得分:1)

如果您打算在多个.c文件中使用全局变量,最好在.h文件中声明它们。但是,如果要在C ++中保留类private成员数据等变量,最好通过函数提供对全局数据的访问。

而不是

extern int foo;

使用

int getFoo();
void setFoo(int);

那种模仿类的成员变量的private访问说明符。

答案 4 :(得分:0)

一般来说,你可以做的是在源文件中定义变量,比如extension Array{ mutating func removeElementsAtIndexes(indexset:NSIndexSet){ self = self.enumerate().filter({!indexset.containsIndex($0.index)}).map({$0.element}) } } ,然后在extern的其他文件中引用这个全局变量,比如int g_foo;。您可以将extern int g_foo; do_sth(g_foo);声明放在头文件中,并将其包含在其他源文件中。不建议在头文件中定义数据。

答案 5 :(得分:0)

如果您希望它是全局(外部链接),则应将其放在 .h 文件中。我认为这是最好的做法之一:

<强> public_header.h

#ifdef YOUR_SOURCE
 #define EXTERN 
#else
 #define EXTERN extern
#endif

EXTERN int global_var;

<强> your_source.c

//your source makes definition for global_var
#define YOUR_SOURCE 
#include <public_header.h>

<强> other_source.c

#include <public_header.h> //other sources make declaration for global_var

如果您希望它是私有(内部链接),我认为最好的解决方案就是在源文件而不是头文件中定义它,以防止头文件是包含在另一个来源中,然后混淆。

<强> your_souce.c

static int private_var;