C/C++(预处理)

预处理

常量的存在形式之一。

#define PI 3.14242\
            42434
//续行符\,标识一行

缺点:

#define N 2+3
//#define N (2+3)
int main()
{
    printf("N = %d\n",N);
    printf("N*2 = %d\n",N*2);//8,相当于2+3*2,仅仅只是替换,遇到优先级高的先算优先级高的。
}

带参宏(宏函数)

将短小精悍的函数进行宏化,这样可以嵌入到代码中,减少调用的开销。但是代价就是编译出的文件可能变化大。
宏函数常常一行表达不完,如多行,为了形式上的方便,多采用续行付接续。

#define S(a,b) a+b
//S后面不能有空格
int main()
{
    printf("S(1,2) = %d\n",S(1,2));// 3
}
#define S(a,b) ((a)*(b))
//是严格意义上的替换,作为一个整体较好
#define Max(a,b) ((a)>(b)?(a):(b))
//这种短小精悍的代码
int main()
{
    printf("S(2+3,4+5) = %d\n",S(2+3,4+5));//45
    return 0; 
}

演技高超的替身演员,一定要用替换后的代码看待,不要把宏当作真真的函数

取消宏

#define PI 3.14 //定义
....

#undef PI //取消

条件编译

一句条件决定是否参与编译

//整体上是双路
#if 0
//不执行部分
#else
//执行部分
#endif
// 双路组合
#define X86     1
#define MIPS    2
#define POWERPC 3

#ifdef X86
//...
#ifndef MIPS
//...
#else 
//...
#endif
#define X86     1
#define MIPS    2
#define POWERPC 3
#define MACHINE X86
#if MACHINE == X86
//...
#elif MACHINE == MIPS
//...
#elif MACHINE == POWERPC
//...
#endif

//以后只需修改MCHNIE即可。

头文件包含(#include)

包含:全写入,被包含的文件中。
"<stdio.h>"这种是系统指定路径中所包含的头文件。
"myString.h" 自己所使用的由自己所写的库

""先到当前路径下找,找不到再到系统路径下找。

多文件编程

优点:

方便管理。协同开发,
便于分享与加密(做成函数库)
前提:
c语言是以文件为单位进行编译的,编译器只需要函数声明即可,连接简短提供实现就可以万册灰姑娘可执行文件。
文件可分为单个部分:
文件的声明部分.h文件[在此文件中写函数用到的声明,结构体声明,宏定义,函数声明]
main.c
实现过程[函数具体实现功能]

文件声明.h

#ifndef __MY_LIST_H__//如果没有定义,则定义,避免重复定义
#define __MY_LIST_H__
...声明部分

#endif

文件的具体实现.c
自包含:

#include "xxx.h"
//1.类型的需要
//2.函数间调用相互调用省略了前向声明

main.:
谁用谁包含:

#include "xxx.h"

...

多文件的编译

其它总结

int main()
{
    char buf[] = "China" "is" "great";
    pritnf("%s\n",buf);

    return 0;
}
#define str(x) "aaxbb"

//#define str(x) "aa"#x"bb" //这样可以
int main()
{
    printf("%s\n",str(1));
    printf("%s\n",str(2));
    printf("%s\n",str(3));
    //无法替换
    return 0;
}

用途:

#define printSqr(x) printf("sqr("#x") = %d\n",x*x);

int main()
{
    printSqr(5);
}

"##"运算黏合

#define S(a,b) aa+bb
//#define S(a,b) a##b+b##b
int main()
{
    printf("%d\n",S(1,2));

    return 0;
}

eg:

#define X(n) X##n
int main()
{
    int X(1) = 10;
    int X(2) = 20;

    printf("x1 = %d x2 = %d\n",x1,x2);
//x1 = 10,x2 = 20
    return 0;
}

预定义宏

打印日志的时候比较有用

#include <stdio.h>
#include <stdlib.h>
void why_me();
int main()
{
    printf( "The file is%s.\n",__FILE__); // _ _
    printf( "The date is %s.\n",__DATE__);
    printf( "The time is %s.\n",__TIME__);
    printf( "This is line %d.\n",__LINE__);
    printf( "This function is %s.\n",__func__);
    why_me();
    return 0;
}
void why_me()
{
    printf( "This function is %s\n",__func__);
    printf( "The file is %s.\n",__FILE__);
    printf( "This is line %d.\n",__LINE__);
}

posted @ 2018-02-09 00:16  seafwg  阅读(261)  评论(0编辑  收藏  举报