我在头文件中声明了一些常量:
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"
不,这不好,而且它们也不是常数。通过在声明中初始化
extern
变量,声明就变成了定义。由于它具有外部链接,因此必须遵守一次定义规则并且只能定义一次;但你的将在包含标题的任何地方定义。
如果它们是常量,则通过内部链接使它们成为常量:
const int g_iShortSize1FrameEncoded=30;
^^^^^
另一方面,你说你需要“经常改变它们”。如果您的意思是它们实际上在运行时发生变化(而不是通过编辑初始化程序和重新编译来更改它们),那么它们就不能是常量;相反,您需要在标头中声明它们并在一个源文件中定义它们:
// declarations in header
extern int g_iShortSize1FrameEncoded; // no initialiser
// definitions in source file
int g_iShortSize1FrameEncoded = 30;
无论哪种情况,变量都将按照其定义的顺序进行初始化;因此,只要没有值依赖于后面的变量的值,它们就会得到预期的值。
通常你只需将其放入头文件中:
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
关键字——您写道它们是常量。
这种全局变量通常这样使用:
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;
}