Posts tagged ‘c’

##(两个井号)和#(一个井号)都是什么意思

连接符 ##(两个井号)
不知道什么符 #(一个井号)
## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释
#符是把传递过来的参数当成字符串进行替代。
假设程序中已经定义了这样一个带参数的宏:
#define PRINT( n ) printf( “token” #n ” = %d”, token##n )
同时又定义了二个整形变量:
int token9 = 9;
现在在主程序中以下面的方式调用这个宏:
PRINT( 9 );
那么在编译时,上面的这句话被扩展为:
printf( “token” “9” ” = %d”, token9 );
注意到在这个例子中,PRINT(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。
可想而知,上面程序运行的结果就是在屏幕上打印出token9=9
还有点不明白?!
再来一个例子:
#define PRINT( n ) printf( “token” #n ” = %d”, game##n )
int token9 = 9;
int game9 = 99;
调用:
PRINT(9);
屏幕上打印出:
token9 = 99;

关于函数参数带省略号(转)

转自:http://www.rupeng.com/forum/thread-1251-1-1.html

本文在很大程度上改编自网友kevintz的“C语言中可变参数的用法”一文,在行文之前先向这位前辈表示真诚的敬意和感谢。
一、什么是可变参数
我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: 
int printf( const char* format, …); 
它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式: 
printf(“%d”,i); 
printf(“%s”,s); 
printf(“the number is %d ,string is:%s”, i, s); 
以上这些东西已为大家所熟悉。但是究竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现,这个问题却一直困扰了我好久。本文就这个问题进行一些探讨,希望能对大家有些帮助.

Continue reading ‘关于函数参数带省略号(转)’ »

强烈推荐一本linux C教程

linux C编程一站式学习

这本书很值得一看,书中基本上涵盖了linux c编程的所有技术,对于想在linux下开发的人来说是一本不错的入门了解书。

在线地址:http://learn.akae.cn/media/

附赠高级bash脚本编程指南:http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/

svn官方文档:http://www.subversion.org.cn/svnbook/nightly/index.html

shell脚本官方文档:http://learn.akae.cn/media/ch31.html