标题：define
#与##
#define GPEBLT_FUNCNAME(basename) (SCODE (GPE::*)(struct GPEBltParms *))&GPE::##basename 
在#define中，标准只定义了#和##两种操作。#用来把参数转换成字符串，##则用来连接前后两个参数，把它们变成一个字符串。 　
#include <stdio.h> 　
#define paster( n ) printf( "token " #n" = %d\n ", token##n ) 　
int main() 　
{ 　
int token9=10; 　
paster(9); 　
return 0; 　
} 　
输出为[leshy@leshy src]$ ./a.out 　token 9 = 10 
详见百科#typedef（很相似的)。
作用
在C或C++语言源程序中允许用一个标识符来表示一个字符串，称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时，对程序中所有出现的“宏名”，都用宏定义中的字符串去代换，这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。 
在C或C++语言中，“宏”分为有参数和无参数两种。
宏定义
宏定义优点(1) 方便程序的修改 
使用简单宏定义可用宏代替一个在程序中经常使用的常量，这样在将该常量改变时，不用对整个程序进行修改，只修改宏定义的字符串即可，而且当常量比较长时， 我们可以用较短的有意义的标识符来写程序，这样更方便一些。我们所说的常量改变不是在程序运行期间改变，而是在编程期间的修改，举一个大家比较熟悉的例 子，圆周率π是在数学上常用的一个值，有时我们会用3.14来表示，有时也会用3.1415926等，这要看计算所需要的精度，如果我们编制的一个程序中 要多次使用它，那么需要确定一个数值，在本次运行中不改变，但也许后来发现程序所表现的精度有变化，需要改变它的值， 这就需要修改程序中所有的相关数值，这会给我们带来一定的不便，但如果使用宏定义，使用一个标识符来代替，则在修改时只修改宏定义即可，还可以减少输入 3.1415926这样长的数值多次的情况，我们可以如此定义 #define pi 3.1415926，既减少了输入又便于修改，何乐而不为呢？ 
(2) 提高程序的运行效率 
使用带参数的宏定义可完成函数调用的功能，又能减少系统开销，提高运行效率。正如C语言中所讲，函数的使用可以使程序更加模块化，便于组织，而且可重复利用，但在发生函数调用时，需要保留调用函数的现场，以便子函数执行结束后能返回继续执行，同样在子函数执行完后要恢复调用函数的现场，这都需要一定的时间，如果子函数执行的操作比较多，这种转换时间开销可以忽略，但如果子函数完成的功能比较少，甚至于只完成一点操作，如一个乘法语句的操作，则这部分转换开销就相对较大了，但使用带参数的宏定义就不会出现这个问 题，因为它是在预处理阶段即进行了宏展开，在执行时不需要转换，即在当地执行。宏定义可完成简单的操作，但复杂的操作还是要由函数调用来完成，而且宏定义所占用的目标代码空间相对较大。所以在使用时要依据具体情况来决定是否使用宏定义。无参宏定义无参宏定义的一般形式为： #define 宏名 字符串　
无参宏的宏名后不带参数。 
其定义的一般形式为： 　#define 标识符 字符串 
其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。 　
例如：　#define M (a+b)　它的作用是指定标识符M来代替表达式(a+b)。在编写源程序时，所有的(a+b)都可由M代替，而对源程序作编译时，将先由预处理程序进行宏代换，即用(a+b)表达式去置换所有的宏名M，然后再进行编译。 　
程序1： 
#include <stdio.h>
#define M (a+b) 　
int main()
{ 　
int s,a,b; 　
printf("input number a& b: "); 　
scanf("%d%d",&a,&b); 　
s=M*M; 　
printf("s=%d\n",s); 　
} 　
上例程序中首先进行宏定义，定义M来替代表达式(a+b),在 s= M * M 中作了宏调用。在预处理时经宏展开后该语句变为： S=(a+b)*(a+b) 　但要注意的是，在宏定义中表达式(a+b)两边的括号不能少。否则会发生错误。 　如当作以下定义后：#define M (a)+(b) 　在宏展开时将得到下述语句：S= (a)+(b)*(a)+(b) 　
对于宏定义还要说明以下几点： 　
1. 宏定义是用宏名来表示一个字符串，在宏展开时又以该字符串取代宏名，这只是一种简单的代换，字符串中可以含任何字符，可以是常数，也可以是表达式，预处理程序对它不作任何检查。如有错误，只能在编译已被宏展开后的源程序时发现。 　
2. 宏定义不是说明或语句，在行末不必加分号，如加上分号则连分号也一起置换。 　
3. 宏定义必须写在函数之外，其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。 　（有关#undef 请查阅其他资料）带参宏定义c语言允许宏带有参数。在宏定义中的参数称为形式参数，在宏调用中的参数称为实际参数。对带参数的宏，在调用中，不仅要宏展开，而且要用实参去代换形参。 
带参宏定义的一般形式为： 　#define 宏名(形参表) 字符串　
在字符串中含有各个形参。 带参宏调用的一般形式为： 　宏名(形参表) 　
例如：　#define M(y) ((y)*(y)+3*(y)) /*宏定义*/ 　 　
k=M(5); /*宏调用*/ 　
在宏调用时，用实参5去代替形参y，经预处理宏展开后的语句为: 　k=5*5+3*5 　
程序2： 　
#define MAX(a,b) (a>b)?a:b 　
main()
{ 　
int x,y,max; 
printf("input two numbers: "); 　
scanf("%d%d",&x,&y); 　
max=MAX(x,y); 　
printf("max=%d\n",max); 　
} 
上例程序的第一行进行带参宏定义，用宏名MAX表示条件表达式 (a>b)?a:b ， 形参a,b均出现在条件表达式中。程序中 max=MAX(x,y) 为宏调用，实参x,y，将代换形参a,b。宏展开后该语句为： max=(x>y)?x:y; 　用于计算x,y中的大数。 
#define 条件编译 　
头文件(.h)可以被头文件或C文件包含；重复包含（重复定义）由于头文件包含可以嵌套，那么C文件就有可能包含多次同一个头文件，就可能出现重复定义的问题的。 通过条件编译开关来避免重复包含（重复定义） 　
例如 　#ifndef __headerfileXXX__ 
#define __headerfileXXX__ 　
文件内容 　
#endif
详见百科#typedef（很相似的）
用法
define() 函数定义一个常量。
常量类似变量，不同之处在于：
在设定以后，常量的值无法更改 
常量名不需要开头的美元符号 ($) 
作用域不影响对常量的访问 
常量值只能是字符串或数字
例子
例子 1定义一个大小写敏感的常量：
<?php define("GREETING","Hello world!");echo constant("GREETING"); ?>
输出：
Hello world!例子 2定义一个大小写不敏感的常量：
<?php define("GREETING","Hello world!",TRUE);echo constant("greeting"); ?>
输出：
Hello world!