A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭启冰 中级黑马   /  2015-12-4 22:15  /  850 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



宏:
    语法:
        #define 宏名 要替换的内容

    注意:不需要加分号,加了分号,它会把分号当做要替换的内容

    作用:就是在编译的时候把用到这个宏的地方,替换成之前定义的“要替换的内容”


有参数的宏:

    语法:
        #define 宏名(参数列表) 要替换的内容

    例:#define GETSUM(a,b) a + b

        有参数的宏可以传任意东西,你传过来是什么,参数就是什么。但是替换时要保证没有语法错误

    注意:参数的括号和宏名之间一定不要加空格
        例:#define GETSUM (a,b) a + b  是错误的



如果要可变参数的宏呢? (记住这样子写法,以后配置全局文件时可能会用到一次)

        用...搭配 ##__VA_ARGS__

    例:
        #define LOG(format,...) printf(format,##__VA_ARGS__)



条件编译命令:


    所有的条件编译命令结尾都要加#endif

    有三种:
            #if-#elif-#else-#endif

            #ifdef-#endif

            #ifndef-#endif


    条件编译的意思:有选择的编译或者不编译某段代码


    #if 条件编译:就是判断右边的表达式是否为真(只能用宏,或者直接写数据)


    #ifdef 宏名
        代码块1
    #endif

        语义:如果定义了宏名,那么编译代码块1,否则不编译代码块1

    #ifdef 宏名
        代码块1
    #else
        代码块2
    #endif

        语义:如果定义了宏名,那么编译代码块1,否则编译代码块2


    #ifndef 宏名
        代码块1
    #endif

        语义:如果没有定义这个宏名,那么编译代码块1,否则不编译代码块1


    #ifndef 宏名
        代码块1
    #else
        代码块2
    #endif

        语义:如果没有定义这个宏名,那么编译代码块1,否则编译代码块2
*/

#include <stdio.h>

#define MYNUM 10

#define GETSUM(a,b) a + b

#define LOG(format,...) printf(format,##__VA_ARGS__)


int main(int argc, const char * argv[]) {
   
    //复习宏、有参宏、可变参数宏
    /*
    LOG("今天天气还行\n"); //替换成 printf("今天天气还行");
   
    LOG("小苍今年%d岁\n",40);//替换成 printf("小苍今年%d岁",40);
   
    LOG("小苍今年%d岁,身高%d米\n",40,165);//替换成 printf("小苍今年%d岁,身高%d米",40,165);
   
   
   // printf("%d\n",MYNUM); //替换成 printf("%d\n",10);
   
//    int nums[MYNUM]; //会替换成 int nums[10];
//   
//    int len = 5;
//   
//    int nums2[MYNUM] = {10,20}; //这是替换成 int nums2[10] = {10,20};
    */
   
    int num = 10;
   
    //#if-#endif
    /*
#define MY_DEBUG 1
   
#if MY_DEBUG == 1
   
    printf("此乃调试阶段\n");
   
#else
    printf("这是正式发行阶段\n");
   
#endif
     */
   
#ifdef MYCO
    printf("定义了宏\n");
#else
    printf("没有定义宏\n"); //编译这句
#endif
   
#ifndef MYCO
    printf("没有定义\n"); //编译这句
#else
    printf("有定义\n");
#endif
   
   
#define MYTEST
   
#ifdef  MYTEST
    printf("有MYTEST这个宏\n"); //编译这句
#else
    printf("没有MYTEST\n");
#endif
   
   
    return 0;
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马