【问题标题】:Defining global constants in C在 C 中定义全局常量
【发布时间】:2019-07-26 14:13:36
【问题描述】:

如何在 C 中定义全局常量? 我被告知要做这样的事情

在 header.h 中

const u32 g_my_const;

在code.c中

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

但是我得到一个编译错误:

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

谁能解释一下如何正确地做到这一点。

【问题讨论】:

  • 不要在h 文件中定义变量(甚至const)。 extern他们在那里。经验法则 - 如果它在内存中创建一个对象 - 它不应该在标题中。
  • 另外说明,除非您坚持支持没有它的实现的代码,否则您应该使用来自<stdint.h> 的固定大小整数类型,而不是自定义整数类型。 (除非,像我一样,你被困在维护那些太顽固而无法使用它的人编写的代码,并且他们决定为它编写自己的标头。)
  • 感谢您的信息,是的,我坚持使用必须保留的遗留架构,我在这里没有太多创新空间 :)

标签: c constants declaration extern stdint


【解决方案1】:

在标题中使用

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;

【讨论】:

  • 好的,非常感谢,这对我来说更有意义
  • 为什么/*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,它会编译---但我想在它自己的翻译单元中定义该对象---如果可能的话)。
  • @AnaNimbus 具有静态存储持续时间的变量应由编译时常量初始化。 C 中的 g_my_const 不是编译时常量。
  • @VladfromMoscow “编译时常量”意味着编译器知道值是什么,而不仅仅是知道值是const,对吧?
  • @AnaNimbus 这样的常量有严格的定义。但总的来说你是对的。
猜你喜欢
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多