我正在尝试使用从文件中获取所述值的方法为我的#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并不好。我正在尝试使用全局变量,但现在错误已更改为“错误:在文件范围内进行了可变修改----” 全局变量不是静态的。 我该怎么办?
答案 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)
- 确定值所需的所有信息在运行时可用,但需要调用函数),这可以通过在编译时运行程序来计算值并编写新的源代码来完成。在编译之前已合并到程序中。如果要初始化一个具有无法在编译时计算的值的对象,因为它只需要在运行时可用的信息,那么必须在正在运行的程序中使用赋值,而不是编译时初始化。