C++ 变量外部声明

问题描述 投票:0回答:3

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

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"
c++ constants extern
3个回答
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
投票

通常你只需将其放入头文件中:

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
关键字——您写道它们是常量。


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

另一个.cpp:

#include "some_header.h"

void another(void)
{
    g_iShortSize1FrameEncoded = 50;
}
© www.soinside.com 2019 - 2024. All rights reserved.