宏、条件编译、编译多文件程序

宏:

   #define 预处理指令用来定义宏

  #include <stdio.h>

  #define PI 3.14f

  int main()

{

   int radius =10;

   printf("请输入半径:");

   scanf("%d",&radius);

   printf("周长=%f\n",2*PI*radius);

   return 0;

}

  在编译命令里使用-D选项指定宏所代表的内容

  #include <stdio.h>

  int main()

{

    int radius = 13;

    printf("请输入半径:");

    scanf("%d",&radius);

    printf("周长=%f\n",2*PI*radius);

    return 0;

}

gcc -DPI=3.14f m.c

  宏不可以使用自己的存储区实现和函数之间的数据传递,宏没有形式参数和返回值


  因为宏没有返回值,所有能当作数字使用的宏,必须写在一对小括号里面,才能保证优先计算内部的操作符

  不能把自增或自减的计算 结果作为宏的参数使用

#define SUB(x,y) ((x-y))


#是一个宏操作符,它可以把宏的一个参数转换成字符串字面值

#include <stdio.h>
#define STR(n)   #n
int main() {
  STR(2+3);
  return 0;
}

##也是一个宏操作符,它可以把一个代表标识符的参数和其它内容连接形成一个新的操作符

#include <stdio.h>
#define STR(n)  #n
#define LOCAL(n) l_##n
int main() {
  int num=0;
  int LOCAL(num)=0;//int l_num = 0;
  STR(2+3);//"2+3"
  return 0;
}


条件编译:

      #ifdef........#else......#endif

#include <stdio.h>

int main()

{

    int order = 0;

    printf("请输入一个数字:");

    scanf("%d", &order);

#ifdef  ZHAOBENSHAN

    if(order ==1)

       printf("没有\n");

    else

       printf("真没有\n");

#else

    if(order==1)

      printf("有\n");

    else

      printf("没有\n");

#endif

    return 0;

}

gcc -DZHAOBENSHAN m.c

 

多文件编程基本步骤:

        1. 把所有函数分散在不同的源文件里(通常主函数单独占一个字节)

        2. 为每个源文件编写配对的以.h作为扩展名的头文件

        3. 在每个源文件里使用#include预处理命令,包含必要的头文件

例子1:

main.c  add.h  add.c

vi main.c

#include <stdio.h>

#include "add.h"

int main()

{

   int num=add(2,7);

   printf("num=%d\n",num);

   return 0;

}


vi add.h

int add(int,int);


vi add.c

#include "add.h"

int add(int num,int num1)

{

   return num+num1;

}


例子2:

 vi main.c

#include <stdio.h>

#include "read.h"

int main()

{

 int num=fun();

  printf("num=%d\n",num);

}

vi read.h

#ifndef _FUN_H_

#define _FUN_H_

int fun(void);

#endif

vi read.c

#include <stdio.h>

#include "read.h"

int fun(void)

{

   int num=0;

   printf("请输入一个数字:");

   scanf("%d",&num);

   return num;

}

gcc main.c read.c


Makefile实现文件程序的编译

Makefile文件中记录整个编译过程,make工具按照Makefile中记录的过程完成编译

Makefile文件中每个编译命令前都应该写tab键而不是空格

头文件中的内容应该包含在条件编译的预处理指令中,这样可以避免重复编译

文件中使用的宏名称应该根据文件名变化得到


如果一个源文件里希望使用另外一个源文件中声明的全局变量,就需要使用 extern关键字,再次把这个变量声明一次

vi main.c

#include <stdio.h>

#include "read.h"

int main()

{

   read();

   printf("num=%d\n",num);

   return 0;

}

vi read.h

#ifndef _READ_H_

#define _READ_H_

extern int num;

void read(void);

#endif

vi read.c

#include <stdio.h>

#include "read.h"

int read(void)

{

  printf("请输入一个数字:");

  scanf("%d",&num);  //想要用num,必须使用extern

}

使用extern关键字声明变量的语句,不会分配内存,所以可写在头文件中


静态全局变量,不可以被其它文件中的语句使用.

静态全局变量的作用域就是这个文件,不能跨函数实现

      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值