从方法

时间:2018-05-24 13:03:46

标签: c variables unix global initializer

我正在尝试使用从文件中获取所述值的方法为我的#define分配值。 我能够从文件中获取值并将其返回到main方法。 define能够调用它并初始化它,但当另一个方法使用所述的定义时,我得到这个错误“初始化元素不是costant” 我试着将方法设置为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并不好。我正在尝试使用全局变量,但现在错误已更改为“错误:在文件范围内进行了可变修改----” 全局变量不是静态的。 我该怎么办?

2 个答案:

答案 0 :(得分:4)

可能存在对“/usr/bin/bash”的误解。它是一个预处理器指令,意味着在编译源代码之前,它由预处理器修改,然后预处理器将其交给编译器。

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

More on preprocessor directives.

在您的情况下,预处理器值当然不能在运行时“设置”。您可能希望在整个过程中设置和使用不是#define的全局变量。

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

答案 1 :(得分:0)

在C中,要初始化一个具有计算值而不是常量的对象,可以在主例程中设置它(或者在启动时从主例程调用的例程):

static unsigned long testValue;

int main(void)
{
    testValue = getValue();
    …
}

在C中,除了简单的“常量表达式”之外,无法初始化具有计算值的静态对象。如果要初始化具有可在编译时计算的值的对象(例如, sin(.01) - 确定值所需的所有信息在运行时可用,但需要调用函数),这可以通过在编译时运行程序来计算值并编写新的源代码来完成。在编译之前已合并到程序中。如果要初始化一个具有无法在编译时计算的值的对象,因为它只需要在运行时可用的信息,那么必须在正在运行的程序中使用赋值,而不是编译时初始化。