是否可以在运行时在 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)。


  1. 如果它被初始化为全零字节,它被放置在一个在 运行 时分配的内存页中,但是它全为零的事实必须在编译时仍然是已知的,以便知道采用这种方法。