20170426

如果一个里面需要经过复杂的处理才能得到一个结果数字,则这个宏必须写成一个表达式
  1 /*
  2     宏演示
  3  */
  4 #include <stdio.h>
  5 #define SQUARE(n)   ((n) * (n))
  6 int main() {
  7     int num = 4;
  8     printf("%d\n", SQUARE(++num));//((++num) * (++num)),第一个++num,num为5,第二个++num,num为6,然后相乘36
  9     return 0;
 10 }
结果:36
宏操作符包括#和##
#操作符可以把宏的一个参数转换成字符串字面值
  1 #include <stdio.h>
  2 #define STR(n)  #n
  3 int main() {
  4     printf("%s\n", STR(abc));
  5     return 0;
  6 }
  STR(abc)先替换成 #abc, 然后二次替换 "abc"
##操作符可以把一个代表标识符参数和其它内容合并形成一个新的标识符
  1 #include <stdio.h>
  2 #define LOCAL(n)    l_##n
  3 int main() {
  4     int LOCAL(num) = 0;
  5     printf("%d\n", LOCAL(num));
  6     return 0;
  7 }
LOCAL(num)先替换成l_##num,然后二次替换为l_num(##抛弃)

条件编译可以在编译时只编译某些语句而忽略另外一些语句
#ifdef(#ifndef) <宏名称>
    ...
#else
    ...
#endif
以上语句结构可以根据某个宏是否被定义过而从两组语句中选择一组编译
  1 /*
  2     条件编译
  3  */
  4 #include <stdio.h>
  5 int main() {
  6 #ifdef  ONE
  7     printf("1\n");
  8 #else
  9     printf("2\n");
 10 #endif
 11     return 0;
 12 }
如果定义了ONE的宏,执行第7行,否则执行第8行

#ifndef 表示没有定义过

#if        逻辑表达式
    ...
#elif    逻辑表达式(多个)
    ...
#else
    ...
#endif
以上结构可以根据任何逻辑表达式多组语句中选择一组编译
  1 /*
  2     折扣
  3  */
  4 #include <stdio.h>
  5 int main() {
  6 #if defined(FACTORY)
  7     printf("80%%\n");
  8 #elif !defined(FACTORY) && !defined(ELITE)
  9     printf("100%%\n");
 10 #else
 11     printf("120%%\n");
 12 #endif
 13     return 0;
 14 }

多文件程序编写时,某个函数必须属于某个文件,一个文件中可以包含多个函数
  1 /*
  2     多文件编程演示
  3  */
  4 #include <stdio.h>
  5 int add(int x, int y) {
  6     return x + y;
  7 }
  8
  9 int main() {
 10     printf("%d\n", add(3, 6));
 11     return 0;
 12 }

多文件程序编写步骤
1.为所有函数分散在多个不同的.c源文件中(通常主函数单独写在一个原文件中)
2.为每个.c源文件编写对应的.h头文件(如果原文件中只包含主函数则不需要编写对应的头文件)
头文件中应该包含对应源文件中所有函数的声明
3.为每个.c源文件找到所有需要的头文件,并包含进来
4.采用gcc命令完成编译,要把所有源文件名称都写在命令中
例: gcc 13.c 13add.c
头文件中要采用条件编译,以避免多次编译的问题
#ifndef        __13ADD_H__
#define        __13ADD_H__
int add(int, int);
#endif     //__13ADD_H__

在一个源文件中使用另外一个源文件声明的全局变量时需要使用extern关键字再次声明一下这个变量
extern关键字声明的变量声明语句经常放在头文件中,方便使用
静态全局变量不可以被其它源文件使用

posted @ 2017-04-26 17:57  小不懂装懂  阅读(138)  评论(0编辑  收藏  举报