簡體   English   中英

如何使用純C在main()函數中初始化全局常量變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM