我的C实践(1):宏的应用
1、为了调用宏时能得到正确结果,在宏体中建议对宏的每个参数用括号括起来,并且当宏体是一个表达式时整个宏体也用括号括起来。
/* c1.c:将两个数相乘 */
#define product(x,y) ((x)*(y))
#include <stdio.h>
int main(){
int a=1,b=2,c=3,d=4,x=0;
x=product(a+3,b)+product(c,d); /* 若宏体中没有使用括号,则得不到
你想要的结果 */
printf("%d\n",x);
return 0;
}
2、用宏来插入任意语句。
/* c2.c:插入任意语句 */
#define insert(stmt) stmt /* 插入任意语句 */
#include <stdio.h>
int main(){
int a,b;
insert({ a=1;b=1; }) /* 这是一个复合语句 */
insert({ a=1,b=1; }) /* 如果逗号表达式不用圆括号括起,则预处理器会认为
有两个实参,报错 */
printf("a=%d, b=%d\n",a,b);
return 0;
}
注意,第2个调用中逗号表达式语句要用括号括起来,否则预处理器会认为给宏传了两个实参,由于没有两个实参的incr,因此会报错。
3、为了使函数式宏能像真正的函数一样工作,建议用do{ }while(0)语句包住宏体的代码。
/* c3.c: 交换两个整型变量的值 */
/* #define swap(x,y) { int temp=x; x=y; y=temp; } */
#define swap(x,y) \
do { int temp=x; x=y; y=temp; } while(0)
#include <stdio.h>
int main(){
int x=4,y=3;
if(x>y) swap(x,y); /* 用第一个swap时会出错,导致{ }后面有一个分号,
用第二个swap则没问题 */
else x=y;
printf("x=%d, y=%d\n",x,y);
return 0;
}
如果用注释中定义那个swap,则if {...};后面会一个分号,单独的分号是一个空语句,这导致if与else之间有两个单独的语句不合法。而用do{ }while(0)套住语句时则不会有这样的问题。
4、用宏来包装语句。
/* c4.c:打印1到20的立方表,用宏来包装循环语句 */
#define incr(v,low,high) \
for((v)=(low); (v)<=(high); (v)++)
#include <stdio.h>
int main(){
int j;
incr(j,1,20)
printf("%2d %6d\n",j,j*j*j);
return 0;
相关文档:
Python
的
C/C++
扩展
By phidoit@gmail.com
可扩展性是
Python
的一大特色,一方面,由于
Python
是解释执行的,这导致运行速 ......
http://c.chinaitlab.com/c/basic/200907/789321.html
词法陷阱:
1 = 不同于==不要在程序中将两者写错,小心。将表达式与常量比较时,可将常量放在左边。
2 &和| 不同于& ......
The meaning of each is:
MemberMeaningRange
tm_sec
seconds after the minute
0-61*
tm_min
minutes after the hour
0-59
tm_hour
hours since midnight
0-23
tm_mday
day of the month
1-31
tm_mon
months since January
0-11
tm_year
years since 1900
tm_wday
days since Sunday
0-6
tm_yday
d ......
Crimson来自于Sun捐赠给Apache的ProjectX项目,Xerces来自IBM捐赠给Apache的XML4J项目,结果Xerces胜出,成了Apache XML小组全力开发的XML API,而Crimon已经早就不做了,如今Xerces名满天下,到处都是在用Xerces DOM和SAX解析器,只有Sun不服气,非要在JDK1.4里面使用过时的Crimson,让人感觉像是在赌气一样,真是让 ......
面试时被问到过,不甚明了,网上百度一下,整合了两个仁兄的文章,如下。:-)
时常在cpp的代码之中看到这样的代码:
#ifdef __cplusplus //c++编译环境中才会定义__cplusplus (plus就是"+"的意思)
extern "C" { //告诉编译器下面的函数是c语言函数(因为c++和c语言对函数的编译转换不一样,主要是c++中存在重载)
#en ......