阅读:1563回复:24
请问下面这个问题是不是c的一个bug啊!
为什么下面这样不对
#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 也是对的! |
|
沙发#
发布于:2003-06-16 12:45
俺曾经试过cb也是有问题,在VC6里面也有问题啊!不知道是什么原因呢!
|
|
板凳#
发布于:2003-06-16 12:50
在gcc里面也是有问题啊!
|
|
地板#
发布于:2003-06-16 13:25
是因为你嵌套#if的缘故吧。
要干什么,写个inline的函数不行吗? [编辑 - 6/16/03 by arthurtu] |
|
地下室#
发布于:2003-06-16 13:29
#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吧。 |
|
5楼#
发布于:2003-06-16 13:34
你试一下这个就知道了。
#include...//就不写了 #define A(if, else, endif) printf(#if);printf(#else);printf(#endif) int main() { A(1, 2, 3); return 0; } |
|
6楼#
发布于:2003-06-16 13:35
估计是连接器的问题,我也遇到过类似的情况,后来就用别的方法了
|
|
7楼#
发布于:2003-06-16 15:03
#define A(a) (#if AAA==1 1 #else 1 #endif) 可是 #define A() (#if AAA==1 1 #else 1 #endif) 是可以的啊!没有任何的错误,编译连接也是对的啊 |
|
8楼#
发布于:2003-06-16 15:46
你在代码中用一下就知道了。呵呵。
|
|
9楼#
发布于: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的,上面说得很清楚(错误代码) |
|
|
10楼#
发布于:2003-06-16 17:21
那么我怎么才可以使用#if和#endif在define里面
就是我想使用 #define A(x) (#if (OSVER==1) x #else x+1 #endif) 当定义了OSVER就返回x 当没有定义或者定义的不是1就返回x+1啊! |
|
11楼#
发布于: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 挑战者] |
|
12楼#
发布于:2003-06-16 18:25
那么我怎么才可以使用#if和#endif在define里面 用一个inline函数 //假设x是int inline int A(int x) {return (OSVER==1) ? x : ++x;} ,or #define A(x) ((OSVER==1) ? x : ++x) |
|
13楼#
发布于:2003-06-16 18:29
问题3 你到底想干什么啊? |
|
14楼#
发布于:2003-06-16 18:45
就是当继承类里面如果重载了基类的虚函数,那么就给系统提供一个入口,如果继承类没有重载该虚函数,那么就不给系统提供入口了!
其中继承类到底会不会继承这个函数不是由我确定,但是给不给系统提供入口是由我来确定的啊! |
|
15楼#
发布于:2003-06-16 18:47
还是不明白你到底想干什么 :D
|
|
16楼#
发布于:2003-06-16 19:11
晕!帮我想想有什么好的办法啊!分可以再多,我现在想到的就是从汇编代码级别去获得,而我不想这样做啊!因为这样就比较的不安全了!如果编译器改变了编译的方式就不行了
|
|
17楼#
发布于:2003-06-16 19:49
你是什么意思我都还没有明白啊。。。 :o
|
|
18楼#
发布于:2003-06-16 20:30
例如
class CA { public: virtual void NotiryProc(); private: void RegisterNotiry(); ..... } class CB : public CA { ...... } 当在类CB里面如果重载了CA类的NotiryProc函数,那么RegisterNotiry就注册系统的消息通知,如果没有重载,那么就不注册系统消息通知了。 |
|
19楼#
发布于:2003-06-17 11:21
代码是你写?
这样行不行? class CA { public: virtual void NotiryProc(); protected: void RegisterNotiry(); ..... } class CB : public CA { //如果重载NotiryProc,就在B的NotiryProc call RegisterNotiry } |
|
上一页
下一页