关键词:
#define 和 const 定义的使用及区别
error 2143 2146 2065 2059
syntax error : missing '×××' before '×××'
表现:
错误出现很不正常,有些明明没有语法错误的语句也会报错;这时,就非常有可能像下面的例程一样,坏在一个很小细节上。
----------------------------------示例程序----------------------------------------
//error 2143 2146 2065 2059 的调试
#include <stdio.h>
#define SIZE 5; //罪魁祸首是这个!!
void main(){
int arr[SIZE];
int i=0;
for(;i<SIZE;i++)
printf("%d",arr[i]);
}
--------------------Configuration: A - Win32 Debug--------------------
Compiling...
test.c
F:\Study\Cfiles\A\test.c(5) : error C2143: syntax error : missing ']' before ';'
F:\Study\Cfiles\A\test.c(5) : error C2143: syntax error : missing ';' before ']'
F:\Study\Cfiles\A\test.c(6) : error C2143: syntax error : missing ';' before 'type'
F:\Study\Cfiles\A\test.c(7) : error C2065: 'i' : undeclared identifier
F:\Study\Cfiles\A\test.c(7) : error C2143: syntax error : missing ')' before ';'
F:\Study\Cfiles\A\test.c(7) : error C2059: syntax error : ')'
F:\Study\Cfiles\A\test.c(8) : error C2146: syntax error : missing ';' before identifier 'printf'
Error executing cl.exe.
test.obj - 7 error(s), 0 warning(s)
----------------------------------------
附:#define 与 const 的定义和区别用法:
定义格式:
#define PI 3.14159
const int PI= 3.14159;
1. #define定义的是符号常量,也可以叫做宏,而Const定义的可以说是冻结的变量(即值不可变的变量。主要的区别是:符号常量并不是变量,它只不过是在编译期间通过预编译命令进行一种“替换”;而Const常量是占有内存的被“冻结”了的变量。C++中使用const常量而不提倡用符号常量(用#define存在很多问题,如类型检查,宏扩展错,维护性等)。
2. const是定义一个常量,#define只是直接把代码用别的东西代替(可以替换数值,也可以替换语句)
3. const用编译器,#define用预处理,因此const可以用调试工具查看。const常量一般不分空间,但如果取它的地址或引用,就会分配空间,而#define 不分配空间。 作用域不一样,const分局部和全局,而#define 为文件作用域。另外,const常量存在于程序的数据段,#define常量存在于程序的代码段。
4. 在C中,定义常量的方法是用编译预定义指令(#define).例如:
#define PI 3.1425926
这条指令的格式是#define 后面跟一个常量名再跟一串字符,中间用空格隔开。由于不是C++语句,所以行末不用分号。尽管它具有常量的所有属性,但是,在编译预处理完成后,PI不属于C++程序中的名字了,所以它不是一个具有一定类型的常量名。随后的编译无法发现由它引起的数据类型误用的错误,而const可以用调试工具查看。
C++容许#define 定义常量是为了兼容C。在C++编程中,常量定义都用const,不用#define。
5. const 的不足之处(转):
const int i=0;
void main(){
printf("address of const i:%08X\n",&i);
}
对于以上的代码,我希望编译的时候提示出错,但很可惜,没有任何错误发生
再来看看,
const int i=0;
void main(){
int *p=(int*)&i;
*p=33;
}
编译,通过!!但程序一运行就立即发生不人见人爱的非法操作..-_-
从上面的2则代码中,我们可以看出
(1) const 也需要占用内存,并且需要占用文件空间,这对程序来讲,无疑是种残酷的折磨
不过,当遇到访问这个变量时语句时,编译器会用常数而不是内存寻址的方式
(2) 在一定的程度来讲, const 会导致严重的后果,一但代码比较多,这种错误往往难以被发现(其实#define也是一样的)。
所以,我还是建议要用常量的朋友用#define(看看自带的.h,哪个不是用#define的?),如果你对#define还是觉得不怎样,那还可以试试用enum (测试环境: VS6.0,Win98Se)
联系客服