以下两个代码在c ++文件中工作正常,但在c中编译错误,为什么? 它似乎使用const变量导致c中的一些问题, 我使用dev c ++ 5.11
19 3 C:\ Users \ tjc \ Desktop \ c练习\ Untitled4.c [错误]可能无法初始化可变大小的对象
19 3 C:\ Users \ tjc \ Desktop \ c练习\ Untitled4.c [警告]数组初始值设定项中的多余元素
19 3 C:\ Users \ tjc \ Desktop \ c练习\ Untitled4.c [警告](接近初始化' A')
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int cmpW( const void* p1, const void*p2){
float *pf1 = (float*)p1;
float *pf2 = (float*)p2;
return pf1[0] - pf2[0];
}
int cmpH( const void* p1, const void*p2){
float *pf1 = (float*)p1;
float *pf2 = (float*)p2;
return pf2[1] - pf1[1];
}
int main(void)
{
const size_t n = 5;
float A[n][2] = {0}; //line 19
int i=0;
for(i=0; i<n; ++i){ // Data input.
printf("W H: ");
scanf("%f %f", &A[i][0], &A[i][1]);
}
qsort(A, n, sizeof(float) * 2, cmpW ); // By weight
for(i=0; i<n; ++i) // Data input.
printf("(%f, %f) ", A[i][0], A[i][1]);
printf("\n");
qsort(A, n, sizeof(float) * 2, cmpH ); // By height
for(i=0; i<n; ++i) // Data input.
printf("(%f, %f) ", A[i][0], A[i][1]);
printf("\n");
system("pause");
}
答案 0 :(得分:4)
这与C和C ++如何处理限定为const
的变量有所不同。在C中,const
变量不被视为真常量,因此声明float A[n][2]
被视为可变长度数组,即使n
被声明为const int
来自C standard:
的第6.6节(常量表达式)8 算术常量表达式应具有算术类型,并且只能具有整数常量的操作数, 浮点常量,枚举常量,字符常量,
sizeof
表达式,其结果是整数常量,和_Alignof
个表达式。算术常量表达式中的转换运算符只能将算术类型转换为算术类型 类型,除了作为sizeof
或的操作数的一部分_Alignof
运营商。
由于A
被视为可变长度数组,因此可能无法初始化。
从第6.7.9节(初始化):
3 要初始化的实体的类型应为未知大小的数组或完整的对象类型不是 可变长度数组类型。
答案 1 :(得分:0)
我认为,这是编译器特殊错误,而不是const变量错误。如果您更改代码,则仍然存在相同的错误。
size_t n = 5;
float A[n][2] = {0};
或
int n = 5;
float A[n][2] = {0};
如果你从工具 - >编译器选项 - &gt;程序在DevC ++中为C设置g ++。exe编译器,问题就会解决。但是,这不安全。我想解释问题的原因。