我在头文件中声明了一些常量:
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"
答案 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;
}