![](/img/trans.png)
[英]Why doesn't this program in C compile? Error: undefined reference to `i2c_smbus_read_byte_data'
[英]Why doesn't this C program compile? What is wrong with this?
为什么这个C程序不能编译? 这有什么问题?
我在wxDevC++
和Turbo C ++ 3.0上尝试过它。
#include<stdio.h>
#include<conio.h>
const int SIZE = 5;
int main(int argc, char ** argv)
{
char array[SIZE] = {'A', 'B', 'C', 'D', 'E'};
printf("Array elements are,\n");
int i=0;
for(i=0 ; i<SIZE ; ++i)
{
printf("%c ", array[i]);
}
getch();
return 0;
}
两个编译器上的错误消息类似。
f:\_Source-Codes\main.c In function `main':
8 f:\_Source-Codes\main.c variable-sized object may not be initialized
C89 / 90语言中的数组大小必须由整数常量表达式指定(对于C99,通常也是如此)。 C中的const int
对象不是常量表达式 ,这就是为什么不能使用它来指定数组大小的原因。 注意:这是C和C ++之间的一个显着区别。
在C语言的术语恒定是指文字常量,即5
, 10.2
, 0xFF
, 'a'
等(枚举常数也常数 ,要准确)。 const int
对象再次在C中不是常量 ,不能用于构建常量表达式。
如果要预先声明要在C中用作数组大小的命名常量,则必须使用#define
或enum
。 这同样适用于案例标签,位字段大小以及需要恒定表达的每个其他上下文。
有关详细信息,请参阅此
如果编译器将其视为'.c'文件,则int i
声明需要在printf
之前的任何可执行行之前。
编辑,现在您显示错误消息:
编译main时,编译器不会将SIZE
视为常量。 您可以使用#define SIZE 5
作为解决方法。
根据K&R 2nd Ed。 :
“
const
的目的是宣布可能放在只读内存中的对象。除了它应该诊断显式尝试更改const对象之外,编译器可能会忽略[const]限定符”。
因此,声明const int SIZE = 5
不会使SIZE
成为常量表达式 ,这是数组大小说明符所需要的。
尝试更换
const int SIZE = 5;
同
#define SIZE 5
大多数C编译器不允许声明其大小包含在变量中的静态数组(即数组大小是在运行时确定的)。
试试这个:
char array[] = {'A', 'B', 'C', 'D', 'E'};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.