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

有关C语言的问题。

    来源: 互联网  发布时间:2014-12-01

    本文导语:  刚开始打算看linux的源码,可是c语言基础有限,有很多问题,不很清楚。下面是一个有关linux宏定义的问题。 宏定义如果如果有参数其有点很容易理解,但像下面开始这样的宏定义又有什么意义呢?联系上下看看,似...

刚开始打算看linux的源码,可是c语言基础有限,有很多问题,不很清楚。下面是一个有关linux宏定义的问题。
宏定义如果如果有参数其有点很容易理解,但像下面开始这样的宏定义又有什么意义呢?联系上下看看,似乎是与条件编译有关,可是要怎么理解呢?这种定义一般怎么使用?我的这点c语言基础实在无法理解,希望那位朋友能帮忙解答一些,谢谢!

下面只是一个例子,在内核的源码里面还有很多这种应用,先谢谢了!!

100分送上!

___________
include/asm-i386/boot.h  linux2.5.10内核
______________________

#ifndef _LINUX_BOOT_H
#define _LINUX_BOOT_H

/* Don't touch these, unless you really know what you're doing. */
#define DEF_INITSEG 0x9000
#define DEF_SYSSEG 0x1000
#define DEF_SETUPSEG 0x9020
#define DEF_SYSSIZE 0x7F00

/* Internal svga startup constants */
#define NORMAL_VGA 0xffff /* 80x25 mode */
#define EXTENDED_VGA 0xfffe /* 80x50 mode */
#define ASK_VGA 0xfffd /* ask for it at bootup */

#endif



|
给你说个例子吧,看你挺认真学习的
假如这样:
 --sample.h--
#ifndef SAMPLE_H
#define SAMPLE_H
#define MAX_VAL 254  //定义一个最大值
void ShowVal(); //声明这个函数
#endif

 --sample.c--
#include "sample.h"
void ShowVal() { printf("Max Val = %dn",MAX_VAL);}
 
  -- main.c --
#include "sample.h"
int main()
{
   ShowVal();
  printf("main VAL = %dn",MAX_VAL + 1);
 return 0;
}
这样编译:gcc -o main main.c sample.c
你注意上面main.c和sample.c都#include "sample.h"了。现在gcc在这次编译中,要有两个.c文件编译。假如它先编译sample.c。sample.c第一次#include"sample.h",因为这时没有SAMPLE_H符号的定义,所以编译器就会执行#define SAMPLE_H这个预编译指令,定义一个SAMPLE_H符号。接着,sample.h中还有#define MAX_VAL 254,这时,编译器就知道,以后会用254这个值换掉所有后面见到的MAX_VAL.这样编译器必须也要记住MAX_VAL这个符号。
那,现在编译器又开始编译main.c了。因为在编译sample.c时,已经定义了SAMPLE_H,现在main.c里想去#include "sample.h"代码展开时,#ifndef SAMPLE_H条件不成立,所以sample.h的代码,实质上就没有包含到main.c单元中。但编译器这时已经知道了MAX_VAL 和ShowVal的意义。所以编译顺利通过。
如果你不用上面的预编译控制。那在编译main.c时,编译器又见到了#define MAX_VAL 254.这样就有重复定义了。
还好,两个.c都用一个头文件,那么MAX_VAL重复来重复去,还是254。那要是还有个地方定义了#define MAX_VAL 12 并且也被E#include 到main.c中。看你用哪个值?!
我够罗嗦了吧。要是有说错的地方,那要当是心情不好啦!

|
#ifndef _LINUX_BOOT_H //如果没有定义_LINUX_BOOT_H则(编译下一行)
#define _LINUX_BOOT_H //定义_LINUX_BOOT_H
。。。
#endif                //结束#if 判断 #endif和#if 是配对使用的

这样做的目的是避免头文件被重复包含

|
#define _LINUX_BOOT_H //定义_LINUX_BOOT_H
是为了避免宏和函数被重复声明,而不是真正要定义什么具体的内容

    
 
 

您可能感兴趣的文章:

  • 有关Linux下用eclipse写C++语言程序的编译问题
  • [求助]c语言有关?:的问题。
  • 我想写一个简单的操作系统,能不能推荐一下有关这方面的书?最好是C语言的
  • 用source insigt 看Linux0.11内核完全注释中的内核源码时,发现了一个有关c语言语法的奇怪现象。大虾请进,帮小弟解解惑。有重谢!
  • linux C语言中有关'n'的疑惑!
  • 有关Sql语言中的日期格式化
  • 求教有关smartupload的问题,有关就给分!!
  • 有关在sco unix5.0.4下有关网卡设置的问题(非常急,高分相送)
  • 有关snmp的一个很菜,但是困扰了我很久的问题,有关工作原理的,望大家赐教
  • 有关ResultSet的问题,帮助解决问题者另外加分...
  • (菜鸟问题)有关目录中文件执行的问题???
  • 有关Qt下编译的环境问题
  • 有关裁减内核及shell命令的问题
  • 有关cocoon的问题??
  • Helper! 有关Jbuilder使用问题???
  • 有关swing的问题,请高手回答
  • 一个有关分数的问题
  • 有关pcmaclan的打印机共享问题
  • 请教有关samba共享名大小写的问题
  • 想看一下吗?有关swing 组件的问题?
  • 有关L的问题(菜鸟求教)???
  • 有关jsp服务器的一个问题
  • java 进阶级问题,有关网络的问题,请多多帮助
  • 有关Liunx 的最低配置问题
  • 有关环境的问题
  • 请教有关konqueror 问题?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ​有关Docker的八个令人难以置信的事实
  • 有关内码转换(跟HttpServletRequest有关)
  • 求有关png图像处理的libpng库的有关中文资料
  • 大家推荐一下有关LINUX7有关的网络编程的书。最好是比较全面的!比较经典的。
  • 有关KDevelop-3.0.4-0.1.i386.rpm的有关软件包
  • 有关KDevelop编程的资料
  • 有关集群与数据同步
  • 请教有关英文简历方面的词句!
  • 有关报表打印(在JAVA,WEB下应用)急用!
  • 请各位大哥告知JAVA中消息机制的有关资料,拜托!
  • 有关jbuilder
  • 我想看看有关Linux和Unix的源码,有什么好的建议
  • 有关J2ME的帮助文档!
  • 100分求助 能不能提供一些有关图像分割的算法和实现代码!谢谢
  • 在哪里可以弄到有关tomcat配置方面的资料?
  • 请问哪里有jboss有关配置的教程,最好是中文的,先谢了
  • 哪位兄弟知道有关QT的资料可以下,,谢谢!
  • 有关学习java的电子图书网址
  • 请介绍一本有关i386体系结构、汇编的书。
  • 有关shell返回值
  • 高分请教:请问怎么才能得到最近所有有关文件操作(新建,删除等)的记录


  • 站内导航:


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

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

    浙ICP备11055608号-3