0

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

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"
4

3 回答 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;

在任何一种情况下,变量都将按照它们的定义顺序进行初始化;所以只要没有值依赖于后面的变量的值,它们就会得到预期的值。

于 2013-05-28T14:24:40.903 回答
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关键字——你写道它们是常量。

于 2013-05-28T14:24:25.510 回答
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

主.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;
}
于 2013-05-28T14:24:50.707 回答