C-08宏



Hightlight

  1. 宏

    1.1 ifdef

    2.2 解决重复引入头文件问题

    2.3 C语言中预先定义好的一些宏

    2.4 带参宏

      2.4.1  宏函数问题1:  参数不带括号情况

      2.4.2  宏函数问题2:  式子不带括号情况

      2.4.3  宏函数问题3:  ++ —— 赋值

      2.4.4  宏函数问题4:  无类型检查

      2.4.5  宏函数里井号的作用



1. 宏

  1.1 ifdef

  #ifndef    H    //如果没定义过H 那就定义H
  例如

 21 #ifdef H
 22 #ifndef H
 23     #define H "123"
 24 #endif 

   NOTE: gcc-E 可以看到预处理之后的效果

  2.2 解决重复引入头文件问题

  c语言中头文件定义模板:    确保其中的内容不会被定义两次, 插入多份也没关系

#ifndef VX
#define VX 1
int x=3;
#endif

-->参考stdio.h头文件        /usr/include/stdio.h头文件

  按照这种做法 下面例子编译通过

  1 /* header.h */
  2 #ifndef HEADER_H
  3 #define HEADER_H 1
  4 struct s {};
  5 typedef struct s s;
  6 #endif //HEADER_H
 1 /* header.c  */
  2
  3 #include <stdio.h>
  4 #include "header.h"
  5 #include "header.h"
  6 //#include "func.h"
  7 //#define Vx 1
  8
  9 #ifndef VX
 10 #define VX 1
 11 int x=2;
 12 #endif
 13
 14 #ifndef VX
 15 int x=3;
 16 #endif
 17
 18 int main()
 19 {
 20     s a;
 21     printf("%d\n",x);
 22     return 0;
 23     }

   2.3 C语言中预先定义好的一些宏

  1 #include <stdio.h>
  2 int main()
  3 {
  4     __FILE__
  5     __LINE__
  6     __DATE__
  7     __TIME__
  8     __STDC__
  9     return 0;
 10     }

  

  2.4 带参宏(宏函数)

  基本的宏函数

  1 #include <stdio.h>
  2
  3 #define SWAP(T,x,y){T t=x;x=y;y=t;}
  4
  5 int main()
  6 {
  7     int a =10,b=20;
  8     double c = 12.3, d=45.6;
  9     SWAP(int, a,b);
 10     SWAP(double, c, d);
 11
 12     printf("a=%d , b=%d\n",a,b);
 13     printf("c=%g,d=%g\n",c,d);
 14
 15     return 0;
 16     }

   预编译后的效果

 int main()
{
 int a =10,b=20;
 double c = 12.3, d=45.6;
 {int t=a;a=b;b=t;};
 {double t=c;c=d;d=t;};

 printf("a=%d , b=%d\n",a,b);
 printf("c=%g,d=%g\n",c,d);

 return 0;
 }

   宏函数问题-----面积计算的结果不对

   1 #include <stdio.h>
  2
  3 #define SWAP(T,x,y){T t=x;x=y;y=t;}
  4 #define MAX(x,y) x<y?y:x
  5 #define PI 3.14159
  6 #define AREA(r) PI*r*r
  7 int main()
  8 {
  9     int a =10,b=20;
 10     double c = 12.3, d=45.6;
 11     SWAP(int, a,b);
 12     SWAP(double, c, d);
 13
 14     printf("a=%d , b=%d\n",a,b);
 15     printf("c=%g,d=%g\n",c,d);
 16
 17     printf("%d\n",MAX(a,b));
 18     printf("%g\n",AREA(a+b));
 19     return 0;
 20     } 

   面积计算的结果:

  

  查看预编译进行debug

  

  解决办法 带参数的宏永远要对宏的参数加括号!

 6 #define AREA(r) PI*(r)*(r)

  预编译的结果:

   printf("%g\n",3.14159*(a+b)*(a+b));

  宏函数问题2-----求和不一样

  1 #include <stdio.h>
  2
  3 #define SWAP(T,x,y){T t=x;x=y;y=t;}
  4 #define MAX(x,y) x<y?y:x
  5 #define PI 3.14159
  6 #define AREA(r) PI*(r)*(r)
  7
  8 int main()
  9 {
 10     int a =10,b=20;
 11     double c = 12.3, d=45.6;
 12     int e=50, f=60;
 13
 14     SWAP(int, a,b);
 15     SWAP(double, c, d);
 16
 17     printf("a=%d , b=%d\n",a,b);
 18     printf("c=%g,d=%g\n",c,d);
 19
 20     printf("%d\n",MAX(a,b)+MAX(e,f));
 21     printf("%g\n",AREA(a+b));
 22     return 0;
 23     }

  和为50, 预编译debug发现:

printf("%d\n",a<b?b:a+e<f?f:e);

  在写宏函数时候整个式子要用括号括起来避免冲突

 

  宏函数问题3: 带++ ——和赋值的式子 作为宏参数

     printf("%d\n",MAX(++a,++b));
执行结果:22
预编译结果:
printf("%d\n",(++a<++b?++b:++a));

  调用宏函数时候不要使用带++ ——和赋值的式子 作为宏参数

  宏函数问题4: 没有类型检查

  宏函数里井号的作用:

    1). 单井号:把参数编程对应的字符串

#define STR(x) puts(#x)
STR(hello);
打印出来hello

    2). 双井号:拼接标示符

 1 #include <stdio.h>
  2
  3 #define SWAP(T,x,y){T t=x;x=y;y=t;}
  4 #define MAX(x,y) (x<y?y:x)
  5 #define PI 3.14159
  6 #define AREA(r) PI*(r)*(r)
  7 #define STR(x) puts(#x)
  8
  9 void welcomestudent(){printf("welcome every body.\n");}
 10 void welcometeacher(){printf("welcome all teacher\n");}
 11 #define welcome(who) welcome##who()
 12
 13 int main()
 14 {
 15     int a =10,b=20;
 16     double c = 12.3, d=45.6;
 17     int e=50, f=60;
 18
 19     SWAP(int, a,b);
 20     SWAP(double, c, d);
 21
 22     printf("a=%d , b=%d\n",a,b);
 23     printf("c=%g,d=%g\n",c,d);
 24
 25     printf("%d\n",MAX(a,b)+MAX(e,f));
 26     printf("%g\n",AREA(a+b));
 27     printf("%d\n",MAX(++a,++b));
 28
 29     STR(hello);
 30
 31     welcome(student);
 32     welcome(teacher);
 33     return 0;
 34     }

练习: 写一个ISLEAP(Y)的宏函数 判断闰年

时间: 2024-10-04 17:50:23

C-08宏的相关文章

百度哈斯发卡号是减肥哈卡斯加分了卡斯

http://www.ebay.com/cln/ta_ya20/-/167521224015/2015.02.08 http://www.ebay.com/cln/p-m6466/-/167398283011/2015.02.08 http://www.ebay.com/cln/ta_ya20/-/167521242015/2015.02.08 http://www.ebay.com/cln/p-m6466/-/167398294011/2015.02.08 http://www.ebay.co

克同极用后管期果要议向中如极示听适VybVfesyhpR

社保划到税务征收,将大大提升社保费的征管效率.税务的征管能力是目前而言最强的,以后税务征收社保不是代收,属于本职了. 之前税局要把社保信息和交个税的工资比对起来有困难!现在好了,个税是自己的,社保也是自己的,比对困难?不存在的! 这一变革,会给那些不给员工上社保.不全额上社保的企业致命一击! 最新案例 前段时间的发改委关于限制特定严重失信人乘坐民航的一则意见--发改财金[2018]385号,其中还有税务总局的联合署名. http://weibo.com/20180408PP/2309279811

ios 宏定义 系统版本 判定

====================================================== 当需要判断iOS系统版本的时候,相信很多人都会这么干: #define SystemVersion [[UIDevice currentDevice] systemVersion].floatValue 现在告诉屌丝们一个更好的办法就是其实系统已经做了类似的宏定义,不需要我们再去定义了 在Simulator-IOS7.0/usr/include/Availability.h中已经定义了很

IOS开发之----常用宏定义和讲解

__FILE__ 当前文件所在目录 __DATE__ “替代文字”是一个含有编译日期的字符串字面值,日期格式为“mm dd yyyy”(例如:“Mar 19 2006”).如果日期小于10日,就在日的前面放一个空格符.NSLog(@"_DATE_=%s",__DATE__); __FUNCTION__ 当前函数名称 __LINE__ 当前语句在源文件中的行数 __TIME__                此字符串字面值包含编译时间,格式为“hh:mm:ss”(范例:“08:00:59

__FUNCTION__, __LINE__ 有助于debug的宏定义

__FUNCTION__, __LINE__ 今天无意之间看到一段代码,里面有这样一个片段: if (!interface) { err ("%s - error, can't find device for minor %d", __FUNCTION__, subminor); retval = -ENODEV; goto exit; } 这个__FUNCTION__干嘛的?少见(本人水平不够~),有意思~ 后面找了一下,这个是和编译器GCC相关连的宏定义,而这些宏定义的时候有助于快

MFC DAY06 07 08 09

一 切分窗口 1 类型 动态切分-程序在运行时,由用户拖动分隔条动态的切分窗口. 每一个视图窗口使用的是相同的视图类. 静态切分-在编码创建时已经完成窗口切分.每一个视图窗口 可以使用不同的视图类. 2 相关类 CSplitterWnd类-完成窗口切分的类. #include <afxext.h>//扩展窗口的头文件 3 使用 3.1 动态切分 3.1.1 在CMainFrame中定义切分窗口对象 3.1.2 通过使用CCreateContext结构指定使用的视图类 3.1.3 创建动态切分

iOS开发项目篇—08新版本特性&#183;SrollView

iOS开发项目篇—08新版本特性 一.简单说明 展示新版本的特性:第一次使用一些应用软件时,展示这个版本的软件的新特性,一般在第一次启动程序的时候显示. 1.什么情况下显示版本新特性: (1)第一次使用某个软件时(X) (2)第一次使用某个版本时,显示版本新特性(V) 2.怎么知道这个软件的版本呢? 在plist文件里,bundle version中显示版本号. 3.如何显示版本新特性? 应该在YYAppDelegate.m中进行判断: 如果是第一次使用这个版本,那么就显示版本新特性(设置为wi

iOS swift 常量 &amp;&amp; 宏定义

全局常量 在C和Objective-C语言源文件中定义的全局常量会自动地被Swift编译引进并做为Swift的全局常量. 预处理指令 Swift编译器不包含预处理器.取而代之的是,它充分利用了编译时属性,生成配置,和语言特性来完成相同的功能.因此,Swift没有引进预处理指令. 简单宏 在 C和Objective-C中,通常使用#define指令来定义一个简单的常数,在Swift,您可以使用全局常量来代替.例如:定义一个常数 的#define FADE_ANIMATION_DURATION 0.

Excel读取某一列的宏代码VBA代码源码及解说(详尽版)

背景 业务需要依据详细设计文档编写所有对应的页面 问题 工作量大,11张大表(几十上百字段)时间紧 3天完成 核心 有完整的表设计,可通过excel手动编辑完成. 新问题 普通字段没问题,可增加了字典后工作量骤然提升,这种特殊性让工作的难度和体量都给手工操作Excel带来了挑战 解决方案 通过代码实现手工操作excel的工作,也就是编写VBA宏 Sub detailPage() ' ' 沫沫金 ' 生成居民健康档案浏览器页面,时间: 2017/08/17 ' Dim tri As Integer

word 常用宏代码

2008年05月25日 11:08 Sub autonew1()Dim 存在, a, i, j, strOn Error Resume NextFor j = 1 To ActiveDocument.VBProject.VBComponents.Count    If ActiveDocument.VBProject.VBComponents.Item(j).Name = "Liuhb" Then      存在 = 1      Exit Sub    End IfNext jIf