分享

C++中error 2143 2146 2065 2059 的调试

 9loong 2009-08-18
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)

(#)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多