无法定义依赖于 C 中不同头文件中的另一个变量的常量变量

问题描述 投票:0回答:1

我有一组正在尝试编译的 C 文件

//table.c
#include "row.h"

const uint32_t ROW_SIZE_1 = 50; //some random number
const uint32_t PAGE_SIZE = 4096;
const uint32_t ROWS_PER_PAGE = PAGE_SIZE / ROW_SIZE_1;
const uint32_t TABLE_MAX_ROWS = ROWS_PER_PAGE * TABLE_MAX_PAGES;
//row.c
#include "row.h"

const uint32_t ID_SIZE = size_of_attribute(Row, id);
const uint32_t USERNAME_SIZE = size_of_attribute(Row, username);
const uint32_t EMAIL_SIZE = size_of_attribute(Row, email);
const uint32_t ID_OFFSET = 0;
const uint32_t USERNAME_OFFSET = ID_OFFSET + ID_SIZE;
const uint32_t EMAIL_OFFSET = USERNAME_OFFSET + USERNAME_SIZE;
const uint32_t ROW_SIZE = ID_SIZE + USERNAME_SIZE + EMAIL_SIZE;

编译得很好。但是当我更改 table.c 中的第 6 行时 到

const uint32_t ROWS_PER_PAGE = PAGE_SIZE / ROW_SIZE;

编译器抛出错误:初始化器元素不是常量

我的 row.h 文件看起来像这样

//row.h

extern const uint32_t ID_SIZE;
extern const uint32_t USERNAME_SIZE;
extern const uint32_t EMAIL_SIZE;
extern const uint32_t ID_OFFSET;
extern const uint32_t USERNAME_OFFSET;
extern const uint32_t EMAIL_OFFSET;
extern const uint32_t ROW_SIZE;

当所有常量都定义在一个文件中时,程序编译成功。但是当它们在多个文件中定义时,我收到上述错误。

我还尝试在 row.h 文件中定义常量,但这导致了多个定义错误,因为它是在多个区域中导入的

我该如何解决这个问题或者有解决方法吗?

c static constants header-files constant-expression
1个回答
0
投票

严格来说,两者都应该导致错误,因为

const
变量不是常量表达式

当你将它们放在一个文件中时,编译器会以这种方式对待它们(这不符合 IMO),但是当你将它们定义在另一个编译单元中时,它无法在编译过程中“猜测”此表达式的值。

© www.soinside.com 2019 - 2024. All rights reserved.