标头中#define定义的变量不是由代码设置的

时间:2017-11-23 15:09:37

标签: c c-preprocessor

我制作了一个非常简单的代码来计算函数的值:

#define MIN 0.00001
#define MAX 1
#define MAXP 10000


 double func_log(double x)
{
    double r=RPWN;
printf(" MAXP = %e  \n",MAXP);
printf(" MIN = %e  \n",MIN);
printf(" MAX = %e  \n",MAX);

    double y;
    if (x>r || x==0) return(0.0);
    else {
        y = r+((r*r)/(2.*x)-x/2.)*log((1+r/x)/(r/x-1));  
    }
    return y;       

}

该函数位于file.c中,该文件是使用其他源文件编译的。问题是MAXP无法设置为其值。当我要求打印出MINMAXPMAXP的值时,我会得到以下内容:

 MAXP = 4.940656e-324  
 MIN = 1.000000e-05  
 MAX = 1.000000e+00

我真的不明白为什么我4.940656e-324获得MAXP,我从未遇到过这样的问题。当我写#define MAXP 10000.时,我得到MAXP = 1.000000e+04。我用gcc编译,有人有任何线索吗?

2 个答案:

答案 0 :(得分:3)

问题不在于MAXP的值,而在于您用来打印它的格式说明符%e

MAXP不是变量,而是宏。因此,它没有与之相关的类型。编译器从上下文中计算1000的类型,如果printf表示int1000的默认解释)。在不同的上下文中,1000可以被解释为floatdouble,例如float f = MAXP;要记住的一件重要事情是MAXP在代码正文中以1000替换文字。

如果您希望默认情况下将MAXP解释为double,请在结尾处添加.0

#define MAXP 10000.0

如果您希望它保持整数文字,请使用%d进行打印

printf(" MAXP = %d  \n", MAXP);

或添加显式广播:

printf(" MAXP = %e  \n", (double)MAXP);

答案 1 :(得分:2)

问题是%e打印float和double类型,但是你的MAXP和MAX类型是整数。

您可以使用%d打印整数。