您好我是C ++开发人员,现在正在进行C编程。
我的问题是哪个地方更适合在c程序中声明全局变量。 标题或源文件(假设我的全局变量未在其他文件中使用)?
我希望这个变量像C ++中的私有变量一样。
答案 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;