当前位置:  技术问答>linux和unix

问题简单问题,linux源码中的" # "是什么意思?

    来源: 互联网  发布时间:2015-07-10

    本文导语:  include/linux/module.h #define __MODULE_STRING_1 #x 请问#x中的#是什么语法? | 宏可以用字符串化运算符“#”和连接运算符“##”。 “#”能将宏的参数转换为带双引号的字符串: #define DEBUG_VALUE(v) prin...

include/linux/module.h
#define __MODULE_STRING_1 #x

请问#x中的#是什么语法?

|
宏可以用字符串化运算符“#”和连接运算符“##”。
“#”能将宏的参数转换为带双引号的字符串:
#define DEBUG_VALUE(v) printf(#v”is equal to %dn”,v)
可以在程序中用DEBUG_VALUE宏检查变量值:
int x = 20;
DEBUG_VALUE(x);
将打印“x is equal to 20”,这是一种很方便的调试工具。
“##”把两个独立的字符串连接成一个字符串:
#include 
#define SORT(type) sort_##type
void sort_int(int **i);
void sort_long(long **l);
void sort_float(float **f);
void sort_char(char **c);
void main(void);
void main(void)
{
int **ip;
long **lp;
float **fp;
char **cp;

SORT(int)(ip);
SORT(long)(lp);
SORT(float)(fp);
SORT(char)(cp);

}
程序对四种数据类型排序。SORT(int)(ip);经编译预处理转换为sort_int(ip);这个宏对类型不敏感。如果在运行时才能确定调用哪个函数,可用此法。
那么,又有一个问题,宏和函数哪个更好呢?宏有一个优点,比函数效率更高,更快,因为它是直接展开,而调用函数还需堆栈,保存地址等额外开销。但宏不能处理大的复杂的代码结构。此外,宏的逐行展开会使程序变大,而函数不会。
所以,一般来说,用宏替换小的可重复的代码段,可以运行更快;而任务复杂或要求程序短小时,用函数。

|
请不要打错(我帮你查了):
include/linux/module.h
#define __MODULE_STRING_1(x) #x

#是粘贴字符窜的意思
__MODULE_STRING_1(hellwolf)
就转换为hellwolf

补充一点当你需要连接字符窜时用##
msdn:
#define paster( n ) printf( "token" #n " = %d", token##n )
int token9 = 9;
If a macro is called with a numeric argument like
paster( 9 );
the macro yields
printf( "token" "9" " = %d", token9 );
which becomes
printf( "token9 = %d", token9 );


|
学习

|
上面之中我个人认为“齐柏林飞艇”有误导的地方
并不是inline不能够取代宏.而是因为宏先于inline于编译器而采用。
inline在编译中无优化时,则作为独立函数使用。而在调试完成加入优化编译后,就成为宏一样融入到代码之中。所以说inline的功能更要优于宏。

|
inline毕竟有类型检查,而宏没有。带来了方便也来带了麻烦
两者应该共存,喜欢用什么就用什么

    
 
 

您可能感兴趣的文章:

  • 请教有关socket的问题,并求telnetd的c源码
  • 4.4BSD源码问题!问题菜一点,还请不吝指教。
  • Linux0.11 内核源码 main函数的参数问题
  • 高手帮解答:数学基本库函数的源码问题.请你吃烤鸭
  • 对老鸟来说的读源码中的超简单问题
  • 源码阅读相关工具问题,大家指教。初学
  • BT源码里面的位图问题
  • fc6的源码rpm包安装问题(在线等待100分)
  • Linux 源码 list.h的编译问题
  • 关于dhcp源码编译出错问题!
  • 安装wu-ftp源码安装包遇到的问题
  • LINUX源码释放磁盘页面的问题
  • 关于UNIX/Solaris源码的问题
  • 关于firefox源码分析问题
  • 请教一个用源码装软件的菜鸟小问题。
  • 新手问题:Java源码能编译成可执行文件(exe文件)吗? 
  • linux使用tar.gz源码包安装 apache 和 mysql 目录问题
  • 纯C语言:分治假币问题源码分享
  • mysql 源码安装的问题
  • Android修改源码解决Alertdialog触摸对话框边缘消失的问题
  • 超级菜鸟的~~不好意思问题~~REDHAT9的视频播放问题~!
  • 问个比较弱的问题,$#,$@,fi是什么意思?
  • 求教一个小问题,bash(1)代表什么意思
  • 请问一个菜鸟问题 linux命令中-lc得意思
  • 很弱的问题:PFN是啥意思
  • 请教个问题:Process #4764 received signal 11, suspending 是什么意思?
  • 超级有意思的一个问题 ;)
  • 新手问题:一个编译错误信息,没有明白意思。
  • 当散粉吧,因为我这个问题不好意思问,嘿嘿
  • 问一个菜鸟问题,192.168.0.0/24是什么意思?
  • 天下第一菜的问题!lilo引导grub引导是什么意思!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • 简单问题简单问题简单问题简单问题
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • 小问题,急问题,重大问题!!!
  • sharepoint 2010中item.Update()和item.SystemUpdate 修改数据版本问题解决
  • 弱弱的一问,linux下的中文问题及网络问题,分不是问题
  • 八个问题帮你快速了解Docker
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  • 错误:将'const x'作为'x'的'this'实参时丢弃了类型限定问题解决
  • 网页的编码问题!或者java的编码问题,由此引出一条解决中文问题的思路
  • nginx Windows版相关问题及使用说明
  • 死锁的问题 多级锁定问题 循环锁定问题
  • vs2010下禁用vmware的方法以及解决vmware插件导致vs2010变慢的问题
  • [问题]双系统出现的问题!求问题的原因和解决办法!
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 初学者问题。一个是编译hello world的问题,一个是配置ssh的问题
  • c/c++服务器程序内存泄露问题分析及解决
  • C程序问题:哪个高手帮我解释下下面的问题,主要是a[0]和&[0] 的区别 和编译器的问题??
  • ​部署 Docker 前必须问自己的四个问题
  • swing的问题还是jbuiler的问题??
  • spring的事务类型及spring和hibernate可能导致的问题分析
  • 菜鸟第一次安装红帽子7.2的一箩筐问题。每个问题会开个帖子,各放100分!请有安装经验的老鸟们帮忙解决。第二个问题:什么是LILO?怎么样


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3