为什么自己家的wifi有时连不上网。

c++中的宏定义解释
内容转载自:
  #ifndef
  #define
  #endif
  这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。
C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。
  #ifndef
x&//先测试x是否被宏定义过
  #define
  程序段1 //如果x没有被宏定义过,定义x,并编译程序段1
  #endif
  程序段2
//如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。
  条件指示符#ifndef
的最主要目的是防止头文件的重复包含和编译。了解:条件编译当然也可以用条件语句来实现。
但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标程序较短。如果条件选择的程序段很长,采用条件编译的方法是十分必要的。
补充一些内容
  #ifndef 标示1
//判断"标示1"是否定义,如果被定义则返回假,如果没有被定义则返回真。
  语句1 #ifndef 标示1
  语句2 #define 标示1
  语句3 #endif
  语句4 ……
  语句5 ……
  该段代码意思是:如果标示1没有被定义,则重定义标示1,即执行语句2、语句3、语句4、……;如果标示1已经被定义,则直接跳过语句2、语句3,直接执行语句4、语句5、……
  备注:#ifndef 和 #endif
要一起使用,如果丢失#endif,可能会报错。
  千万不要忽略了头文件中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。
  还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:
  #ifndef
  #define
  ......
  ......
  #endif
  &标识&在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h
  #ifndef _STDIO_H_
  #define _STDIO_H_
  ......
  #endif
详细讨论#ifndef的作用
  在c语言中,对同一个变量或者函数进行多次声明是不会报错的。所以如果h文件里只是进行了声明工作,即使不使用#
ifndef宏定义,多个c文件包含同一个h文件也不会报错。
  但是在c++语言中,#ifdef的作用域只是在单个文件中。所以如果h文件里定义了全局变量,即使采用#ifdef宏定义,多个c文件包含同一个h文件还是会出现全局变量重定义的错误。
  使用#ifndef可以避免下面这种错误:如果在h文件中定义了全局变量,一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误;如果加了#ifndef,则不会出现这种错误。
条件编译的命令的三种形式
条件编译”命令允许对程序中的内容选择性地编译,即可以根据一定的条件选择是否编译。
  条件编译的命令主要有以下几种 :
  # i f d e f标识符
  程序段 I
  # el s e
  程序段 2
  # en di f
  它的作用是当 “ 标识符”已经由# d e f i n e定义过了。则编译“ 程序段 1
” 。 否则编译“ 程序段 2 ” 。其中如果不需要编译“ 程序段 2 ”。则上述形式可以变换 为:
  # i f d e f标识符
  程序段 1
  # en di f
  # i f n d e f 标识符
  # define 标识符
  程序段 1
  # el s e
  程序段 2
  #e n di f
  它的作用是当 “ 标识符 没有由# d e f i n e定义过。 则编译“程序段
1”。否则编译“程序段 2” 。同样当无“ 程序段2 ”时。则上述形式变换为:
  # i f n d e f标识符
  # define 标识符
  程序段 1
  #e n di f
  # if表达式
  程序段 1
  #el s e
  程序段 2
  #endif
  它的作用是
当“表达式”值为真时。编译程序段1。否则则编译程序段
  2。同样 当无程序段 2时,则上述形式变换 为 :
  # 表达式
  程序段 1
  #e n di f
  以上三种形式的条件编译预处理
  结构都可以嵌套使用。 当# e l s e后嵌套 # i f 时,可以使用预处理命令 #
e l i f , 它相
  当于 # e l s e# i f
。在程序中使用条件编译主要是为了方便程序的调试和移植。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。#define只定义宏名不定义值的作用是什么?解决办法 - C++当前位置:& &&&#define只定义宏名不定义值的作用是什么?解决办法#define只定义宏名不定义值的作用是什么?解决办法&&网友分享于:&&浏览:0次#define只定义宏名不定义值的作用是什么?这几天在看侯捷的《STL源码剖析》,前面几页已经觉得困难
例如里面讲解的&stl_config.h&这个头文件,其中有这样的一段代码
#ifdef&__STL_NEED_TYPENAME
#&&&define&typename
根据书中所说,编译器有可能不支持typename关键字,那这样定义有什么用,还有只定义宏名不定义值,会有默认值出现吗?------解决思路----------------------可以当此时值为空串来理解。------解决思路----------------------1.&这里为了防止当你的程序中出现&&typename时,&如果编译器不支持,就把typename换成空的。
2.&宏名和宏值是分开的,定义时有就有。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有【C语言】关于宏定义中#和##符号的使用和宏定义展开问题_Linux编程_Linux公社-Linux系统门户网站
你好,游客
【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
来源:Linux社区&
作者:jiabinjlu
有一道经典的C语言问题,关于宏定义中#和##符号的使用和宏定义展开问题&程序如下:
#include &stdio.h&#define f(a,b) a##b#define g(a)&
#a#define h(a) g(a)&int main(){& & & & printf("%s\n", h(f(1,2)));& & & & printf("%s\n", g(f(1,2)));& & & & return 0;}
答案:第一行:12& 第二行:f(1,2)
1、关于符号#和##
两个符号都只能用于预处理宏扩展。不能在普通的源码中使用它们,只能在宏定义中使用。
简单的说,#是把宏参数变为一个字符串,##是把两个宏参数连接在一起。
关于这两个符号的具体意义和用法可以参见两篇文章:
#和##在宏替换中的作用
C/C++ 宏中"#"和"##"的用法
还有GCC帮助文档上的解释:
2、关于宏展开
预处理过程的几个步骤:
1)字符集转换(如三联字符)
2)断行链接/
3)注释处理,/* comment */,被替换成空格
4)执行预处理命令,如#inlcude、#define、#pragma、#error等
5)转义字符替换
6)相邻字符串拼接
7)将预处理记号替换为词法记号
第4)步即如何展开宏函数的规则:在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。
宏替换顺序英文描述如下:
A parameter in the replacement list, unless preceded by a # or ## preprocessing token or followed by a ## preprocessing token, is replaced by the corresponding argument after all macros contained therein have been expanded.
综合以上,对于这道题来说,第一行h(f(1,2)),由于h(a)非#或者##所以先展开其参数f(1,2),即12,所以变成h(12),然后再宏替换为g(12),再次替换为12。
第二行g(f(1,2)),宏g(a)带有#,所以里面的f(1,2)不展开,所以变成f(1,2)
类似的这种问题在《你必须知道的495个C语言问题》中出现过,在121页的&预处理功能&的问题11.19,有兴趣的朋友可以看一看。
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
读C++ Primer 之构造函数陷阱
读C++ Primer 之智能指针
读C++ Primer 之句柄类
C++11 获取系统时间库函数 time since epoch
C++11中正则表达式测试
本文永久更新链接地址:
相关资讯 & & &
& (06/10/:44)
& (12/13/:07)
& (06/05/:05)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款

我要回帖

更多关于 宽带怎么有时连不上 的文章

 

随机推荐