error C2099: initializer is not a constant 或者error C2099:初始值设定项不是常量

本文通过实例分析了在C语言中遇到的编译错误`error C2099: initializer is not a constant`,探讨了C编译器对函数外部变量声明的要求。解释了静态变量static的初始化特点,以及在C和C++中的差异。同时,文章还涉及了指针和内存分配的问题,并给出了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看一道题:

#include<stdio.h>
const int a=15;
const int b=a+15;

void main()
{
 printf("%d\n",b);

}
很有意思哟:在.c文件中报的是和你一样的,初始值设置不是常量,但在.cpp中可以,结果输出30
改成这样就行
#include<stdio.h>


void main()
{   const int a=15;
    const int b=a+15;
 printf("%d\n",b);

}
因为c编译器不支持函数外动态声明变量和分配空间,如果要必须是常量值,例如下面也不行,只要放到函数中就行
#include<stdio.h>

int c=16;
int d=c;
void main()
{   const int a=15;
    const int b=a+15;
 printf("%d\n",b);

}

同样的下面也是

#include <stdio.h>
#include <malloc.h>
#define SIZE 4

 float *p=NULL;
 p=(float *)malloc(SIZE*sizeof(float));

int main()
{
 int i=0;

 for(i=0;i!=SIZE;++i)
  p[i]=99;
 for(i=0;i!=SIZE;++i)
  printf("%f\n",p[i]);

 return 0;
}

 

要改成下面这样:

 

 

#include <stdio.h>
#include <malloc.h>
#define SIZE 4

 

int main()
{
 int i=0;
 float *p=NULL;
 p=(float *)malloc(SIZE*sizeof(float));
 for(i=0;i!=SIZE;++i)
  p[i]=99;
 for(i=0;i!=SIZE;++i)
  printf("%f\n",p[i]);

 return 0;
}

 //看看下面有意思的


#include<stdio.h>
//static int b;

int fun()
{
int a=15;
static int b;
b=a;
b++;

return b;
}
//void print()
//{b++;
//printf("%d\n",b);
//}
//void print1()
//{
//printf("%d\n",b);
//}
void main()
{

 printf("%d\n",fun());
 printf("%d\n",fun());
 /*print();
 print1();*/
}

这样的话全为16,原因是static int b;第一次初始化为0,以后不会初始化为0了,

而下面这样的话结果是16和17,元素师static int b=a;初始化为15,以后不会初始化为15了。

#include<stdio.h>
//static int b;

int fun()
{
int a=15;
static int b=a;

b++;

return b;
}
//void print()
//{b++;
//printf("%d\n",b);
//}
//void print1()
//{
//printf("%d\n",b);
//}
void main()
{

 printf("%d\n",fun());
 printf("%d\n",fun());
 /*print();
 print1();*/
}

 

但是如果上面的这段代码出现在.c文件,记住哟不是.cpp文件中就会出现类似的错误:error C2099:初始值设定项不是常量,解决就是把

static int b;定义到函数外

 同样一段在.cpp文件中和.c文件不一样:

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
typedef  void * (*pFun)(void *,int);

void * intMax(void * arg,int nCount)
{ int * agu=(int *)arg;
  static int Max=*agu;
  for(int i=1;i<nCount;i++)
   if(Max<*(agu+i))
    Max=*(agu+i);
   else
    continue;
  return &Max;

}
void * floatMax(void * arg,int nCount)
{ float * agu=(float *)arg;
 static float Max=*agu;
  for(int i=1;i<nCount;i++)
   if(Max<*(agu+i))
    Max=*(agu+i);
   else
    continue;
  return &Max;

}
void * doubleMax(void * arg,int nCount)
{ double* agu=(double *)arg;
  static double Max=*agu;
  for(int i=1;i<nCount;i++)
   if(Max<*(agu+i))
    Max=*(agu+i);
   else
    continue;
  return &Max;

}

void * charMax(void * arg,int nCount)
{ char* agu=(char *)arg;
  static char Max=*agu;
  for(int i=1;i<nCount;i++)
   if(Max<*(agu+i))
    Max=*(agu+i);
   else
    continue;
  return &Max;

}
void main()
{  /* int a[]={3,2,56,45,78};
 void  * result=intMax(a,5);
 cout<<*((int *)result)<<endl;
    float a[]={3.34f,2.34f,56.45f,45.32f,78.3456f};
 void  * result=floatMax(a,5);
 cout<<*((float*)result)<<endl;*/

 double a[]={3.34,2.34,56.45,45.32,78.3456};
 void  * result=doubleMax(a,5);
 cout<<*((double*)result)<<endl;
 char  a1[]={'A','a','h','f','B'};
 void  * result1=charMax(a1,5);
 cout<<*((char*)result1)<<endl;


 }


 如果改到.c文件就会出错:改正如下:


#include<string.h>
#include<stdio.h>

typedef  void * (*pFun)(void *,int);

void * intMax(void * arg,int nCount)
{ int * agu=(int *)arg;int i;int pos;
   int Max=*agu;
  for( i=1;i<nCount;i++)
   if(Max<*(agu+i))
   {
    Max=*(agu+i);
    pos=i;
   }
   else
    continue;
  //return &Max;
   return (void*)(agu+pos);;//解决返回局部地址警告
}
void * floatMax(void * arg,int nCount)
{ float * agu=(float *)arg;
  float Max=*agu;int i;int pos;
  for( i=1;i<nCount;i++)
   if(Max<*(agu+i))
   {
    Max=*(agu+i);
    pos=i;
   }
   else
    continue;
 // return &Max;
   return (void*)(agu+pos);;//解决返回局部地址警告
}

void * doubleMax(void * arg,int nCount)
{ double* agu=(double *)arg;
     double Max=*agu;int i;int pos;
  for( i=1;i<nCount;i++)
   if(Max<*(agu+i))
   {
    Max=*(agu+i);
    pos=i;
   }
   else
    continue;
  return &Max;
   //return (void*)(agu+pos);;//解决返回局部地址警告
}

void * charMax(void * arg,int nCount)
{ char* agu=(char *)arg;
    char Max=*agu;int i;int pos;
  for( i=1;i<nCount;i++)
   if(Max<*(agu+i))
  {  Max=*(agu+i);
          pos=i;
        }
   else
    continue;
  return &Max;
  //return (void*)(agu+pos);;//解决返回局部地址警告
}
void main()
{ /*  int a[]={3,2,56,45,78};
 void  * result=intMax(a,5);
 cout<<*((int *)result)<<endl;*/
 // float a[]={3.34f,2.34f,56.45f,45.32f,78.3456f};
 //void  * result=floatMax(a,5);
 //cout<<*((float*)result)<<endl;
 char  a1[6]={'A','a','h','f','B'};
  double a[]={3.34,2.34,56.45,45.32,78.3456};
 void  * result=NULL;
 void  * result1=NULL;
 result= doubleMax(a,5);
 printf("%f\n",*((double*)result));//如果把这句放到result1下面就会出错,可能因为是地址的覆盖吧
    result1=charMax(a1,5);
 printf("%c\n",*((char*)result1));
 //printf("%f\n",*((double*)doubleMax(a,5)));
    //printf("%c\n",*((char*)charMax(a1,5)));

 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值