C ++变量extern声明

时间:2013-05-28 14:02:38

标签: c++ compiler-construction constants extern

我在头文件中声明了一些常量:

extern int  g_iShortSize1FrameEncoded=30;
extern int  g_iByteSize1FrameEncoded=(g_iShortSize1FrameEncoded*2);
extern int  g_iShortSize1FrameDecoded=960;
extern int  g_iByteSize1FrameDecoded=(g_iShortSize1FrameDecoded*2);

这对我来说非常方便,因为我需要在各种应用程序中使用这些“常量”并经常更改它们,我只想这样做一次,这样我就不会忘记改变任何东西。

它汇编得很好。

然而,我的声明有点“狂野”。

我必须相信编译器会以正确的方式编译它。

无论如何我的方法还不错吗?

我不会在运行时更改这些值,仅在开发期间。

我有3个不同的应用程序,并且都消耗/需要这些值。

在应用程序中,我只想将它们包含在

#include "..\..\myconstants.h"

3 个答案:

答案 0 :(得分:3)

不,这不好,而且它们不是常数。通过在其声明中初始化extern变量,声明成为一个定义。由于它具有外部链接,因此必须遵守一个定义规则并且只能定义一次;但是你的任何地方都会被定义。

如果它们是常量,那么使用内部链接制作它们:

const int  g_iShortSize1FrameEncoded=30;
^^^^^

另一方面,你说你需要“经常改变它们”。如果你的意思是他们实际上在运行时更改(而不是通过编辑初始化器和重新编译来更改它们),那么它们不能是常量;相反,你需要在标题中声明它们并在一个源文件中定义它们:

// declarations in header
extern int g_iShortSize1FrameEncoded; // no initialiser

// definitions in source file
int g_iShortSize1FrameEncoded = 30;

在任何一种情况下,变量都将按其定义的顺序初始化;因此,只要没有值取决于后来变量的值,它们就会得到预期的值。

答案 1 :(得分:1)

通常你只需将它放在头文件中:

extern const int  g_iShortSize1FrameEncoded;
extern const int  g_iByteSize1FrameEncoded;
extern const int  g_iShortSize1FrameDecoded;
extern const int  g_iByteSize1FrameDecoded;

和.cpp文件对应于该标题:

const int  g_iShortSize1FrameEncoded=30;
const int  g_iByteSize1FrameEncoded=(g_iShortSize1FrameEncoded*2);
const int  g_iShortSize1FrameDecoded=960;
const int  g_iByteSize1FrameDecoded=(g_iShortSize1FrameDecoded*2);

这种方式链接器知道变量放在一个编译单元中,并从其他编译单元引用它们。另请注意const关键字 - 您写道它们是常量。

答案 2 :(得分:0)

这种全局变量通常使用如下:

some_header.h:

#ifndef SOME_HEADER_FILE_INCLUDED
#define SOME_HEADER_FILE_INCLUDED

extern int  g_iShortSize1FrameEncoded;
extern int  g_iByteSize1FrameEncoded;
extern int  g_iShortSize1FrameDecoded;
extern int  g_iByteSize1FrameDecoded;

#endif

main.cpp中:

#include "some_header.h"

int g_iShortSize1FrameEncoded = 30;
int g_iByteSize1FrameEncoded = (g_iShortSize1FrameEncoded * 2);
int g_iShortSize1FrameDecoded = 960;
int g_iByteSize1FrameDecoded = (g_iShortSize1FrameDecoded * 2);

void another(void);

int main(int argc, char **argv)
{
   another();
   return 0;
}

another.cpp:

#include "some_header.h"

void another(void)
{
    g_iShortSize1FrameEncoded = 50;
}