在C语言中定义全局常量

3

如何在C语言中定义全局常量?我被告知可以像这样做:

在header.h文件中:

```c #define PI 3.1415926 ```

这将定义一个名为“PI”的全局常量,其值为3.1415926。

const u32 g_my_const;

in code.c

#include "header.h"
const u32 g_my_const= 10U;

但我遇到了编译错误:

错误:未初始化的常量'g_my_const'[-fpermissive]

有人能解释一下如何正确做这件事吗?

翻译结果:

但是我遇到了一个编译错误:

错误:未初始化的常量“g_my_const”[-fpermissive]

有人能解释一下如何正确地进行吗?


4
不要在“头文件”中定义变量(即使是const)。在那里使用“extern”。一般原则是 - 如果正在创建内存中的对象,则不应该在头文件中包含它们。 - undefined
2
另外一点需要注意的是,除非你被困在支持没有这个功能的实现代码中,否则你应该使用<stdint.h>中的固定大小整数类型,而不是自定义的类型。(除非像我一样,你被困在维护那些过于固执不愿使用它的人编写的代码中,并且他们决定自己编写头文件。) - undefined
谢谢提供信息,是的,我被困在一个必须保留的旧架构中,这里没有太多创新的空间 :) - undefined
1个回答

9

在头部使用

extern const u32 g_my_const;

在这种情况下,这只是一个常量的声明,在c模块中会有它的定义。
#include "header.h"
const u32 g_my_const= 10U;

正如@Thomas Jager在您的问题中的评论中提到的那样,您可以通过包含头文件<stdint.h>来使用标准类型别名。

例如:

#include <stdint.h>

extern const uint32_t g_my_const;

好的,非常感谢,这对我来说更有意义。 - undefined
为什么 /*header.h*/ extern const unsigned g_my_const; /*EOF*/ /*example.c*/ #include "header.h" /*EOL*/ const unsigned copy = g_my_const; */EOF/* 不能编译通过?gcc -std=c89 -c example.c 报错:error: initializer element is not constant,并指出 g_my_const 是罪魁祸首。(如果我在 #include 后面直接定义 g_my_const,它可以编译通过---但是我希望将该对象定义在自己的翻译单元中---如果可能的话)。 - undefined
1
@AnaNimbus 静态存储期的变量应该由编译时常量进行初始化。在C语言中,g_my_const不是一个编译时常量。 - undefined
@VladfromMoscow "编译时常量"意味着编译器知道值是什么,而不仅仅知道值是const,对吗? - undefined
@AnaNimbus 在这种常量的严格定义中确实存在。但总体而言,你是正确的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接