![](/img/trans.png)
[英]how to reference a static global variable that is after main function in C
[英]How to initialize global constant variable in main() function using pure C?
我該如何進行全局常量初始化? 有可能嗎? 還是有另一種方法可以做我想要的? 我的意思是我需要從main()
獲取的全局參數,並且它們必須是常量。
#include <stdio.h>
#include <stdlib.h>
const int var;
int main(int argc, char *argv[]) {
var = atoi(argv[1]);
/* ... */
return 0;
}
我需要從main()獲得的全局參數,並且它們必須是常量。
沒有OP想要的直接執行的便攜式方法。
代碼需要不同的訪問權限才能進行讀寫。 有效隱藏對真實數據的訪問。
通過另一個文件中定義的函數設置和獲取數據的一種緊密解決方案。 這樣一來,一旦設置就無法更改數據,只能設置一次。
main_var.h
int main_var_get(void);
void main_var_set(int v);
main_var.c
#include <stdlib.h>
#include "main_var.h"
static int var; // This could instead be a struct of many members.
// Or a pointer to a struct with many members.
static int var_init;
int main_var_get(void) {
if (!var_init) {
// Handle call of get before set, perhaps exit or return default value
exit(EXIT_FAILURE);
}
return var;
}
void main_var_set(int v) {
if (var_init) {
// Handle 2nd set, perhaps exit or ignore
exit(EXIT_FAILURE);
}
var = v;
var_init = 1;
}
main.c中
#include <stdio.h>
#include "main_var.h"
int main(void) {
main_var_set(42);
...
printf("%d\n", main_var_get());
}
另一種方法是使用const int *
。 設置之前的訪問與取消引用NULL
是相同的禁止。 嘗試編寫*main_var_addr
就像編寫任何const
對象一樣,都是UB。
main_var.h
extern const int *main_var_addr;
void main_var_set(int v);
main_var.c
#include <stdlib.h>
#include "main_var.h"
const int *main_var_addr = NULL;
static int var;
void main_var_set(int v) {
if (main_var_addr) {
// Handle 2nd set attempt, perhaps exit or ignore
exit(EXIT_FAILURE);
}
var = v;
main_var_addr = &var
}
main.c中
#include <stdio.h>
#include "main_var.h"
int main(void) {
main_var_set(42);
...
printf("%d\n", *main_var_addr);
}
我認為C不允許您在其他地方初始化常量變量。 但是,您可以將var從const更改為static。
這是不可能的,實際上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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.