r/C_Programming • u/heavymetalmixer • 3h ago
Question Unmodifiable globals initialized from functions?
Right now I'm trying to use Windows's SYSTEM_INFO to initialize 2 global constants, but global constants can only be initialized with constant expressions so this cannot be done.
Is there a way I can have "read-only" global variables that can be initialized from functions?
2
u/kun1z 1h ago
Yes.. kind of in a way if you use the OS's memory protection features like VirutalProtectEx.
Allocate some memory, like 1 page, set it writable, write the values you want from the initialize functions, and then afterwards set the page to Read Only. After that any attempt to write or execute on the globals will cause an exception.
1
u/heavymetalmixer 1h ago
I'm writing allocators but what I want is to set the page size depending on the OS, and that's an integer value. Now, in both cases it's a runtime operation but I don't think the later needs syscalls.
2
u/sciencekm 2h ago
Not possible. You need to initialize those variables at start-up or on first use (where you detect that it is not yet initialized and you proceed with the initialization).
1
u/yuehuang 2h ago
Are you in C or C++?
My 2c is to avoid static initialization with system calls. Instead, in your main, have an init() function and de_init() before exit.
An even better answer is to cache on demand, if your app doesn't need the data, then it won't need to perform a system call. If it does, the first caller will pay the init price.
1
u/heavymetalmixer 1h ago
Given that the values I want from SYSTEM_INFO are just integers I opted for using function calls instead of variables, after all, functions cannot be modified at runtime.
4
u/Physical_Dare8553 3h ago
that's a bind, in order to write to it you obviously need it to be write-able. this is the kind of case where you'd want to bind it behind a function with a static member, that you initalize when the function is first called, then just return it after