http://hi.baidu.com/simpleer/blog/item/669a884b4ac3f3f383025cc9.html
关键词: #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)
(#)
|