[1]函数声明或定义中__p的含义是什么?
eg: int ftp_put __P(argv1,argv2);
编译器(预处理器)在某个头文件中判断,如果是一个 ANSI 编译器,将 __P (x) 定义为 x,如果是一个不支持“带原型函数声明”的编译器,将 __P (x) 定义为 () .所以,如果你的编译器不支持“带原型函数声明” :
int ftp_put __P(argv1,argv2); 将被替换为: int ftp_put ();
比如一个函数 int f (int, int); 有些老编译器不支持这种声明,要写成 int f();
那个 __P 就是用来干这个活的。
[2]koenig lookup规则是什么?
eg:
namespace A{
class B{
};
void f(const B&){ }
}
int main()
{
A::B b;
f(b); //OK. lookup finds A::f()
}
如果某个函数的一个或多个参数型别乃定义于函数所处的namespace中,那么你可以不必为该函数指定namespace,此规则称为koenig lookup.
Koeing 查找也称为 ADL (Argument Dependent Lookup )
只用于非受限名称,非受限名称定义:是除了受限名称以外的^_^
受限名称:显式使用:: 或者 -> . 等操作符号访问的名称为受限名称.
再如:
class A
{
friend void Fun(){ } //不能直接在外面调用,名字找不到.
friend void Fun( A p ) {} //OK,通过参数可以找得到Fun的定义.
};
int main()
{
Fun(); //虽然在dev-C++上可以通过,但VC2003不行,这是不标准的.
//同理如果把A改成一个模板类那么这种调用在dev下通不过.而有相应参数就行.
A a;
Fun(a); //OK,dev-C++/VC均可.
}
[3]宏定义中的#,##,#@问题.
#define PR(X) cout << #X;
PR(a)等价于: cout << "a";
#define PR(X) cout << ##aX;
PR(5)等价于: cout << a5;
#define PR(X) cout << #@X;
PR(a)等价于: cout << 'a';
宏定义里面:
#叫做引用文字
##叫做粘贴