是否可以在运行时在 C 中定义常量?
Is it possible to define constants in C at runtime?
我有一个文件,file1.c,如果满足某些要求,我想在其中定义一些常量,以用于另一个文件,file3.c。
file1.c:
#include "header.h"
int set_constants(void) {
#ifdef EXAMPLE_MACRO
int fd, status, size;
fd = open(EXAMPLE_DRIVER, RD_ONLY);
ioctl(fd, EXAMPLE_IOCTL_CHECK_SIZE, &size);
if (size == SIZE_CONDITION) {
/* Here i would like to define the constants
A, B, and C. */
} else {
/* Here I would like to define the constants
A, B, and C to something else than above. */
}
return 0;
#endif
/* If EXAMPLE_MACRO is not defined, I would like to set
A, B and C to something else. */
return 0;
函数 set_constants() 将从 file2.c 中的 init 函数调用,它会调用 [=] 中的函数49=] 使用常量 A:
#include "header.h"
void file2_init(void) {
set_constants();
file3_function();
}
在 file3.c 中,我想创建一个包含 A 元素的全局数组:
#include "header.h"
uint8_t array[A];
void file3_function(void)
{
/* Do something with array */
}
我明白A、B和C不能定义为宏,因为预处理器处理宏时不知道变量size。甚至可以创建这样的常量(使用 C 语言)吗?
我试图在 file1.c 中将 A、B 和 C 定义为全局整数变量(我知道它们不是常量,但这是我目前唯一的想法),并像这样声明它们在头文件中 header.h:
#ifndef _MY_HEADER_H_
#define _MY_HEADER_H
extern int A;
extern int B;
extern int C;
void set_constants(void);
void file3_function(void);
#endif _MY_HEADER_H_
但是我得到了错误:
error: variably modified 'array' at file scope
array[A] 需要在全局范围内,我的问题是,我如何声明和定义 A、B 和 C,以便它们对 file3.c,而且不升上面的错误?
我也尝试过将 A、B 和 C 设为 const int,就像这样;
#include "header.h"
int set_constants(void) {
#ifdef EXAMPLE_MACRO
int fd, status, size;
fd = open(EXAMPLE_DRIVER, RD_ONLY);
ioctl(fd, EXAMPLE_IOCTL_CHECK_SIZE, &size);
if (size == SIZE_CONDITION) {
const int A = 1;
const int B = 1;
const int C = 1;
} else {
const int A = 2;
const int B = 2;
const int C = 2;
}
return 0;
#endif
const int A = 3;
const int B = 3;
const int C = 3;
return 0;
并在 header.h:
中将 A、B 和 C 声明为 extern const int
#ifndef _MY_HEADER_H_
#define _MY_HEADER_H
extern const int A;
extern const int B;
extern const int C;
void set_constants(void);
void file3_function(void);
#endif _MY_HEADER_H_
但是我得到了编译错误:
error: declaration of 'A' shadows a global declaration [-Werror=shadow]
const int A = 1;
In file included from file1.c:
header.h: error: shadowed declaration is here [-Werror=shadow]
extern const int A;
要使全局范围的 uint8_t array[A];
起作用,A
必须在编译时已知。初始化内存在可执行目标文件中。[1] 这样,您将无法使用uint8_t array[A];
;您将需要使用动态内存分配(例如 malloc
)。
- 如果它被初始化为全零字节,它被放置在一个在 运行 时分配的内存页中,但是它全为零的事实必须在编译时仍然是已知的,以便知道采用这种方法。
我有一个文件,file1.c,如果满足某些要求,我想在其中定义一些常量,以用于另一个文件,file3.c。
file1.c:
#include "header.h"
int set_constants(void) {
#ifdef EXAMPLE_MACRO
int fd, status, size;
fd = open(EXAMPLE_DRIVER, RD_ONLY);
ioctl(fd, EXAMPLE_IOCTL_CHECK_SIZE, &size);
if (size == SIZE_CONDITION) {
/* Here i would like to define the constants
A, B, and C. */
} else {
/* Here I would like to define the constants
A, B, and C to something else than above. */
}
return 0;
#endif
/* If EXAMPLE_MACRO is not defined, I would like to set
A, B and C to something else. */
return 0;
函数 set_constants() 将从 file2.c 中的 init 函数调用,它会调用 [=] 中的函数49=] 使用常量 A:
#include "header.h"
void file2_init(void) {
set_constants();
file3_function();
}
在 file3.c 中,我想创建一个包含 A 元素的全局数组:
#include "header.h"
uint8_t array[A];
void file3_function(void)
{
/* Do something with array */
}
我明白A、B和C不能定义为宏,因为预处理器处理宏时不知道变量size。甚至可以创建这样的常量(使用 C 语言)吗?
我试图在 file1.c 中将 A、B 和 C 定义为全局整数变量(我知道它们不是常量,但这是我目前唯一的想法),并像这样声明它们在头文件中 header.h:
#ifndef _MY_HEADER_H_
#define _MY_HEADER_H
extern int A;
extern int B;
extern int C;
void set_constants(void);
void file3_function(void);
#endif _MY_HEADER_H_
但是我得到了错误:
error: variably modified 'array' at file scope
array[A] 需要在全局范围内,我的问题是,我如何声明和定义 A、B 和 C,以便它们对 file3.c,而且不升上面的错误?
我也尝试过将 A、B 和 C 设为 const int,就像这样;
#include "header.h"
int set_constants(void) {
#ifdef EXAMPLE_MACRO
int fd, status, size;
fd = open(EXAMPLE_DRIVER, RD_ONLY);
ioctl(fd, EXAMPLE_IOCTL_CHECK_SIZE, &size);
if (size == SIZE_CONDITION) {
const int A = 1;
const int B = 1;
const int C = 1;
} else {
const int A = 2;
const int B = 2;
const int C = 2;
}
return 0;
#endif
const int A = 3;
const int B = 3;
const int C = 3;
return 0;
并在 header.h:
中将 A、B 和 C 声明为 extern const int#ifndef _MY_HEADER_H_
#define _MY_HEADER_H
extern const int A;
extern const int B;
extern const int C;
void set_constants(void);
void file3_function(void);
#endif _MY_HEADER_H_
但是我得到了编译错误:
error: declaration of 'A' shadows a global declaration [-Werror=shadow] const int A = 1;
In file included from file1.c: header.h: error: shadowed declaration is here [-Werror=shadow] extern const int A;
要使全局范围的 uint8_t array[A];
起作用,A
必须在编译时已知。初始化内存在可执行目标文件中。[1] 这样,您将无法使用uint8_t array[A];
;您将需要使用动态内存分配(例如 malloc
)。
- 如果它被初始化为全零字节,它被放置在一个在 运行 时分配的内存页中,但是它全为零的事实必须在编译时仍然是已知的,以便知道采用这种方法。