说VC编译器是垃圾,你还真别不信!

老邓 2011-02-23 06:29:37
我日!火大啊!!在VC10编译器下调试了2小时,竟然始终无法解决下列编译错误,即使将出错的语句改成:int i = 0; 也报同样的错误!
main.c|231|error C2275: 'IntListData' : illegal use of this type as an expression|
main.c|231|error C2065: 'p' : undeclared identifier|
main.c|231|error C2065: 'p' : undeclared identifier|
main.c|231|error C2223: left of '->data' must point to struct/union|
main.c|231|error C2065: 'p' : undeclared identifier|
main.c|231|error C2223: left of '->next' must point to struct/union|
main.c|231|error C2065: 'p' : undeclared identifier|
main.c|231|warning C4047: '=' : 'IntListData *' differs in levels of indirection from 'int'|
main.c|232|error C2275: 'VoidPtrListData' : illegal use of this type as an expression|
main.c|232|error C2065: 'p' : undeclared identifier|
main.c|232|error C2065: 'p' : undeclared identifier|
main.c|232|error C2223: left of '->data' must point to struct/union|
main.c|232|error C2065: 'p' : undeclared identifier|
main.c|232|error C2223: left of '->next' must point to struct/union|
main.c|232|error C2065: 'p' : undeclared identifier|
main.c|232|warning C4047: '=' : 'VoidPtrListData *' differs in levels of indirection from 'int'|
main.c|239|error C2275: 'VoidPtrList' : illegal use of this type as an expression|
main.c|239|error C2065: 'vl' : undeclared identifier|
main.c|240|error C2065: 'vl' : undeclared identifier|
main.c|240|error C2223: left of '->pushBack' must point to struct/union|
main.c|240|error C2065: 'vl' : undeclared identifier|
main.c|241|error C2065: 'vl' : undeclared identifier|
main.c|241|error C2065: 'vl' : undeclared identifier|
main.c|241|warning C4022: 'function through pointer' : pointer mismatch for actual parameter 1|
main.c|241|error C2065: 'vl' : undeclared identifier|
||=== Build finished: 22 errors, 3 warnings (0 minutes, 0 seconds) ===|


可换成MinGW 4.4.5,连个警告都没有!!!

上代码,顺便BS一下MS,草!!

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <memory.h>

// bool support
enum bool { false, true };
typedef enum bool bool;

// avoid unused warning
#define UNUSED(x) (void)(x)

// delete self
#define OOPC \
void (*delete)(void*)

// Base class
struct Class { OOPC; };
typedef struct Class Class;

// new/delete
#define new(selfClass) new##selfClass()
#define delete(self) \
((Class *)self)->delete(self); \
self = 0

// Abstract Class
#define ABS_CLASS(selfClass) \
typedef struct selfClass selfClass; \
void ctor##selfClass(selfClass *self); \
void dtor##selfClass(selfClass *self); \
struct selfClass

// Class
#define CLASS(selfClass) \
typedef struct selfClass selfClass; \
selfClass* new##selfClass(); \
void delete##selfClass(void *self); \
void ctor##selfClass(selfClass *self); \
void dtor##selfClass(selfClass *self); \
struct selfClass

// Constructor / Implemention new##selfClass
#define CTOR(selfClass) \
selfClass* new##selfClass() { \
selfClass *self = (selfClass *)malloc(sizeof(selfClass)); \
if (!self) \
return 0; \
ctor##selfClass(self); \
BIND_D(delete, delete##selfClass); \
return self; \
} \
void ctor##selfClass(selfClass *self)

#define ABS_CTOR(selfClass) \
void ctor##selfClass(selfClass *self)

#define FATHER_CTOR(fatherClass) \
ctor##fatherClass(F(self, fatherClass))

// Destructor / Implemention delete##selfClass
#define DTOR(selfClass) \
void delete##selfClass(void *self) { \
dtor##selfClass(self); \
free(self); \
} \
void dtor##selfClass(selfClass *self)

#define ABS_DTOR(selfClass) \
void dtor##selfClass(selfClass *self)

#define FATHER_DTOR(fatherClass) \
dtor##fatherClass(F(self, fatherClass))

// Bind member function
#define BIND(selfFunc) \
self->selfFunc = selfFunc

// Bind to Different name function
#define BIND_D(selfFunc, staticFunc) \
self->selfFunc = staticFunc

// Bind to Father's member
#define BIND_F(fatherClass, staticFunc) \
self->fatherClass.staticFunc = staticFunc

// Inheritance
#define INHERIT(fatherClass) \
struct fatherClass fatherClass

// Get Father Pointer
#define F(self, fatherClass) \
((fatherClass *)(&(self->fatherClass)))
#define FF(self, fatherClass, grandfatherClass) \
F(F(self, fatherClass), grandfatherClass)

// Get Son Pointer
#define S(self, selfClass, sonClass) \
((sonClass*)((char *)self - offsetof(sonClass, selfClass)))
#define SS(self, selfClass, sonClass, grandsonClass) \
S(S(self, selfClass, sonClass), sonClass, grandsonClass)

// Information hiding for member variables
#define MEMBER_DECL(selfClass) \
struct selfClass##Member *_memberVariable
#define MEMBER_IMPL(selfClass) \
struct selfClass##Member
#define MEMBER_IMPL(selfClass) \
struct selfClass##Member
#define MEMBER_INIT(selfClass) \
self->_memberVariable = malloc(sizeof(struct selfClass##Member)); \
memset(self->_memberVariable, 0, sizeof(struct selfClass##Member))
#define MEMBER_FREE() \
free(self->_memberVariable); \
self->_memberVariable = 0
#define M \
(*self->_memberVariable)


注意:纯粹的C语言工程,如果想帮忙或测试的话,别建错了工程类型。
谁能让VC编译器编译通过这个代码,我再散300分给他!!
黯然收工!!!
...全文
736 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
老邓 2011-02-24
  • 打赏
  • 举报
回复
真抱歉,结帖时竟然跳过了bdmh。
如果bdmh有看到此回复,请到:http://topic.csdn.net/u/20110223/20/5e4c376b-2ab3-4b13-a853-e69532ca1cb7.html
老邓 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 renzhewh 的回复:]

我的一点小小看法:
1、用这种方法实现支持不同类型的链表,对于同类型的链表来说,有点浪费空间
《C 和指针》中就提到过
2、空间分配方面没有什么出彩的地方
3、完全不应该是一个 4星 的人写出来的
(呵呵,希望 lz 不要生气)
[/Quote]
呵呵,我在玩自己的OOPC(面向对象C语言,我对C很生的,C++也只会一点)。
我只关心是否面向对象(像C++),以及是否足够简单(越简单越好,复杂了我也不会),看这里:
http://topic.csdn.net/u/20110118/11/592a89e0-1cb7-4ce3-b07b-c1607093ee7a.html
老邓 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 renzhewh 的回复:]

除了重复删除外,while 使用 next->next 判断会导致最后一个元素没有被删除
应该使用 while (next)
[/Quote]
谢谢!
普通网民 2011-02-24
  • 打赏
  • 举报
回复
代码问题。
h330513544 2011-02-24
  • 打赏
  • 举报
回复
........咋这错误跟我刚开始写纯C的时候差不多?是不多定义变量的时候位置放不对啊?变量要放函数最上方,不然会导致后面的代码都出错。
newnazi 2011-02-24
  • 打赏
  • 举报
回复
VS2005 菜鸟路过
ccccj 2011-02-24
  • 打赏
  • 举报
回复
LZ,发贴时想过没,是你的代码不兼容vc10,还是vc10无法兼容你的代码......
renzhewh 2011-02-23
  • 打赏
  • 举报
回复
我的一点小小看法:
1、用这种方法实现支持不同类型的链表,对于同类型的链表来说,有点浪费空间
《C 和指针》中就提到过
2、空间分配方面没有什么出彩的地方
3、完全不应该是一个 4星 的人写出来的
(呵呵,希望 lz 不要生气)
renzhewh 2011-02-23
  • 打赏
  • 举报
回复
除了重复删除外,while 使用 next->next 判断会导致最后一个元素没有被删除
应该使用 while (next)
qman007 2011-02-23
  • 打赏
  • 举报
回复
LZ是没有头文件
#include "stdafx.h"

可以不需要这个头文件的

需要在vc里对当前文件设置 不需要预编译头就行了

老邓 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 jixingzhong 的回复:]

- -#
[/Quote]

VC崩溃的原因找到了,重复删除M.list所致。
改成这样就好了:
[code=C]/C++DTOR(listName) \
{ \
listName##Data *next = M.list; \
while (next->next) { \
listName##Data *p = next->next; \
free(next); \
next = p; \
} \
\
MEMBER_FREE(); \
}[/code]
jixingzhong 2011-02-23
  • 打赏
  • 举报
回复
- -#
老邓 2011-02-23
  • 打赏
  • 举报
回复
yjjlyyj151 2011-02-23
  • 打赏
  • 举报
回复
昵称很不好取 2011-02-23
  • 打赏
  • 举报
回复
别着急嘛,编译通不过可以用cl /E main.c > temp.c命令选项重定向到一个文件,看看宏替换后出来的是什么,这样查错更方便,查到以后再返回到define里修改呗

宏替换前最好把非自己定义的头文件给注释起来,可以减少代码量,看着更方便
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 loaden 的回复:]
akirya老兄,能否帮忙找出错误所在?
MinGW 4.4.5编译是一点问题都没有的。

错误不是简单的:声明必须放在函数头部。
而是VC编译器的宏推导失败所致。
[/Quote]
GCC默认是 默认变量随便放的。
貌似没有编译选项关闭这个特性。
proghua 2011-02-23
  • 打赏
  • 举报
回复
6楼说的是对的
proghua 2011-02-23
  • 打赏
  • 举报
回复
11,13,14楼是错误修正
注释掉的部分移到函数头声明
qq120848369 2011-02-23
  • 打赏
  • 举报
回复
恩,有道理.
proghua 2011-02-23
  • 打赏
  • 举报
回复
int main()
{
IntList *il = new(IntList);
VoidPtrList *vl;
il->pushBack(il, 2);
delete(il);
/* VoidPtrList **/vl = new(VoidPtrList);
vl->pushBack(vl, main);
delete(vl);
return 0;
}
加载更多回复(12)

69,394

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧