首页 > 解决方案 > 从方法中设置#define 值

问题描述

我正在尝试使用从文件中获取所述值的方法为我的#define 分配一个值。我能够从文件中获取值并将其返回给 main 方法。定义能够调用它并初始化它,但是当另一个方法使用所说的定义时,我得到这个错误“初始化元素不是常数”我试图将方法设置为 const int 但没有成功。我能做些什么来解决这个问题?

代码示例:

#define VALUE getValue()

int getValueFromFile(){
    File *fp;
    int value;
    if((fp = fopen("configFile.txt","rt")) != NULL){
            fscanf(fp,"value=%d\n",&value);
            fclose(fp);
            return value;
    }else{
            return -1;
}

int getValue(){
    int value;
    if((value=getValueFromFile()) != -1){
          return value;
    }else{
          return 10;
}

然后当我尝试使用它时

static unsigned long int testValue = (unsigned long int) VALUE;

我收到错误“初始化程序元素不是恒定的”


好的,所以#define 不好。我正在尝试使用全局变量,但错误现在更改为“错误:可变修改----在文件范围内”全局变量不是静态的。我应该怎么办?

标签: cvariablesunixglobalinitializer

解决方案


可能对“ #define”是什么有误解。它是一个预处理器指令,这意味着在编译源代码之前,它由预处理器修改,然后将其交给编译器。

就像#include几乎字面上将文本复制并粘贴到源文件的该位置一样,#define让预处理器将标签标记为等于某些文字、宏等,并简单地用给定值替换该标签的所有实例。

更多关于预处理器指令。

在您的情况下,预处理器值肯定不能在运行时“设置”。您可能需要一个不const被设置和使用的全局变量。

请记住,依赖这些(在大多数情况下)是不好的形式,并考虑需要做多少工作才能避免它。


推荐阅读