Это невозможно, на самом деле const
не означает, что переменная является постоянной в C, это только означает, что вам не разрешено изменять значение переменной, но кто-то другой может.
Глобальные значения инициализируются перед основным запуском, это означает, что вы не можете инициализировать во время выполнения, как выполняется эта инициализация, это поведение реализации, поэтому не существует способа «чистого C» выполнить то, что вы просите.
Однако я не понимаю, почему вы не можете инкапсулировать свой глобальный объект:
my_var.h:
int init_my_var(int argc, char **argv);
int get_my_var(void);
my_var.c
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
static int var;
int init_my_var(int argc, char **argv) {
#ifndef NDEBUG
#include <stdbool.h>
#include <assert.h>
{
static bool first = true;
assert(first);
first = false;
}
#endif
if (argc < 2) {
return 1;
}
errno = 0;
long ret = strtol(argv[1], NULL, 10);
if (errno || (ret < INT_MIN || ret > INT_MAX)) {
return 2;
}
var = (int)ret;
return 0;
}
int get_my_var(void) {
return var;
}
main.c:
#include <stdio.h>
int main(void) {
printf("%d\n", get_my_var());
if (init_my_var(2, (char *[]){"", "42"})) {
return EXIT_FAILURE;
}
printf("%d\n", get_my_var());
if (init_my_var(2, (char *[]){"", "0"})) {
return EXIT_FAILURE;
}
}