阅读:1561回复:24

请问下面这个问题是不是c的一个bug啊!

楼主#
更多 发布于:2003-06-16 12:45
为什么下面这样不对
#define AAA         1
#define A(a) (#if AAA==1 1 #else 1 #endif)
而下面这样却是可以的
#define AAA         1
#define A() (#if AAA==1 1 #else 1 #endif)

如果是
#define A(a)        1
也是对的!

最新喜欢:

DanceDance herostudioherost...
沙发#
发布于:2003-06-17 19:55
忘记了地方了
http://www.driverdevelop.com/forum/html_44269.html?1055850813
板凳#
发布于:2003-06-17 19:55
请去用一下这个吧!我就是为了解决程序里面的卸载和AddDevice两个函数入口的问题而提出来的,有什么建议进尽管的提出来吧!
kaput
驱动中牛
驱动中牛
  • 注册日期2002-06-26
  • 最后登录2004-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-17 14:19
看来楼主喜欢把简单的事情用复杂的方法解决..........





天下风云出我辈 一入江湖岁月催 鸿图霸业谈笑中 不胜人生一场醉......
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2003-06-17 14:14
用成员函数来处理消息。。。
你不管有没有重载,都先用A的函数注册了。
还有其它方法的。是一个窗体的proc?
判断用户会怎么样你再来怎么样。。。好难的,也不好。做成不需要考虑用户会怎么样的。 :D
5楼#
发布于:2003-06-17 12:49
类b不是我写,基类A是由我来写,然后别人基于我的这个基类来进行的开发,当重载了虚函数的话我就需要RegisterNotiry把重载的虚函数注册到系统消息通知里面,让系统来调用NotiryProc,如果没有重载,那么就不能注册通知消息函数,
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2003-06-17 11:21
代码是你写?

这样行不行?
class CA
{
public:
virtual void NotiryProc();
protected:
void RegisterNotiry();
.....
}

class CB : public CA
{
//如果重载NotiryProc,就在B的NotiryProc call RegisterNotiry
}
7楼#
发布于:2003-06-16 20:30
例如
class CA
{
public:
   virtual void NotiryProc();
private:
   void RegisterNotiry();
   .....
}

class CB : public CA
{
   ......
}

当在类CB里面如果重载了CA类的NotiryProc函数,那么RegisterNotiry就注册系统的消息通知,如果没有重载,那么就不注册系统消息通知了。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2003-06-16 19:49
你是什么意思我都还没有明白啊。。。 :o
9楼#
发布于:2003-06-16 19:11
晕!帮我想想有什么好的办法啊!分可以再多,我现在想到的就是从汇编代码级别去获得,而我不想这样做啊!因为这样就比较的不安全了!如果编译器改变了编译的方式就不行了
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2003-06-16 18:47
还是不明白你到底想干什么 :D
11楼#
发布于:2003-06-16 18:45
就是当继承类里面如果重载了基类的虚函数,那么就给系统提供一个入口,如果继承类没有重载该虚函数,那么就不给系统提供入口了!
其中继承类到底会不会继承这个函数不是由我确定,但是给不给系统提供入口是由我来确定的啊!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2003-06-16 18:29
问题3
就是怎么用程序知道扩展类里面有没有重载了基类里面的某一个函数呢!
我曾经通过这样来做,结果不行
class A
{
public:
virtual void Display(){::MessageBox(NULL, \"A\", \"A\", MB_OK);};
};

class B : public A
{
public:
virtual void Display(){;}
};

B b;
A a;
void (B::*pB)() = &B::Display;
if(&B::Display != &A::Display) //运行的时候相等
{
::MessageBox(NULL, \"A\", \"A\", MB_OK);
}
else
{
::MessageBox(NULL, \"B\", \"B\", MB_OK);
}
if(b.Display != a.Display) //还是相等
{
::MessageBox(NULL, \"A\", \"A\", MB_OK);
}
else
{
::MessageBox(NULL, \"B\", \"B\", MB_OK);
}



[编辑 -  6/16/03 by  挑战者]

你到底想干什么啊?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2003-06-16 18:25
那么我怎么才可以使用#if和#endif在define里面

就是我想使用
#define A(x) (#if (OSVER==1) x #else x+1 #endif)
当定义了OSVER就返回x
当没有定义或者定义的不是1就返回x+1啊!


用一个inline函数
//假设x是int
inline int A(int x) {return (OSVER==1) ? x : ++x;}
,or
#define A(x) ((OSVER==1) ? x : ++x)
14楼#
发布于:2003-06-16 17:24
问题3
就是怎么用程序知道扩展类里面有没有重载了基类里面的某一个函数呢!
我曾经通过这样来做,结果不行
class A
{
public:
virtual void Display(){::MessageBox(NULL, \"A\", \"A\", MB_OK);};
};

class B : public A
{
public:
virtual void Display(){;}
};

B b;
A a;
void (B::*pB)() = &B::Display;
if(&B::Display != &A::Display) //运行的时候相等
{
::MessageBox(NULL, \"A\", \"A\", MB_OK);
}
else
{
::MessageBox(NULL, \"B\", \"B\", MB_OK);
}
if(b.Display != a.Display) //还是相等
{
::MessageBox(NULL, \"A\", \"A\", MB_OK);
}
else
{
::MessageBox(NULL, \"B\", \"B\", MB_OK);
}



[编辑 -  6/16/03 by  挑战者]
15楼#
发布于:2003-06-16 17:21
那么我怎么才可以使用#if和#endif在define里面

就是我想使用
#define A(x) (#if (OSVER==1) x #else x+1 #endif)
当定义了OSVER就返回x
当没有定义或者定义的不是1就返回x+1啊!
kaput
驱动中牛
驱动中牛
  • 注册日期2002-06-26
  • 最后登录2004-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-06-16 16:29
2个都错误的原因arthurtu都说明白了。
为什么
a:#define A(a) (#if AAA==1 1 #else 1 #endif)
编译错误,而
b:#define A() (#if AAA==1 1 #else 1 #endif)
编译成功?

a是语法错误,if\\else\\elseif不是formal parameter name。

b如果没有被“使用”,也就是没有被“替换”过,该宏实际上在(语法分析后的)代码里是不存在的。

ps:楼主好像不看msdn的,上面说得很清楚(错误代码)



天下风云出我辈 一入江湖岁月催 鸿图霸业谈笑中 不胜人生一场醉......
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2003-06-16 15:46
你在代码中用一下就知道了。呵呵。
18楼#
发布于:2003-06-16 15:03
#define A(a) (#if AAA==1 1 #else 1 #endif)

#define A() (#if AAA==1 1 #else 1 #endif)
应该都不能用,#if中,if被当做一个token,被#转成string,但是你在A()或A(a)里面都没有if这个token
不要嵌套Preprocessor directives吧。

可是
#define A() (#if AAA==1 1 #else 1 #endif)
是可以的啊!没有任何的错误,编译连接也是对的啊
hero_wzhj
驱动牛犊
驱动牛犊
  • 注册日期2002-12-20
  • 最后登录2003-06-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-06-16 13:35
估计是连接器的问题,我也遇到过类似的情况,后来就用别的方法了
上一页
游客

返回顶部