• c语言中使用宏,需要注意的的几点


    使用#define来定义一些宏,进行一些简洁的替换甚至一些带参数的宏,在linux c代码中很常见,说明它很好、很有用,

    但是它也有一些复杂的规矩和陷阱需要注意,下面我记录一些,仅供参考。

    1、当使用""来换行时,第二行要顶格写,否则会多出一个空格。例如:

    #define OW "what are you doi   
           ng?"
    第二行的ng?"没有顶格写,那么进行替换的时候,会这样:
    what are you doi        ng?
    正确的定义为:
    #define OW "what are you doi
    ng?"

    2、宏可以替换数组的长度,但是const定义的常量不可以。

    #define LIMIT  60
    const int LMT=12;
    int a[LIMIT];     //有效

    int a[LMT];        //无效
    原因:在C中,非自动数组的大小应该是整型常量表达式,这意味着数组大小必须是
    整型常量的组合(如5)、枚举常量和sizeof表达式,但不包括const声明的值。

    3、多写逗号导致的错误。

    可以用__VA_ARGS__进行可变个数的传参,但是_VA_ARGS__在函数体内不要私自加上逗号,比如:

    #define PR(x,...)   printf("Message "#x":" __VA_ARGS__)

    如果写成:

    #define PR(x,...)   printf("Message "#x":" ,__VA_ARGS__)

    就会报错,原因是"Message "#x":"并非和前面的x对应关系,_VA_ARGS__里面仍然可以有字符串。

    一个完整的小例子:

     1 #include <stdio.h>
     2 
     3 #define PR(x,...)   printf("Message "#x":" __VA_ARGS__)                                                              
     4 
     5 int main(void)
     6 {
     7     double x=48;
     8     double y;
     9     y=x*x;
    10     PR(1,"x=%g
    ",x);
    11     PR(2,"ping fang of x is %.2f
    ",y);
    12 
    13     return 0;
    14 }
  • 相关阅读:
    命令行编译运行java工程(转)
    JAVA配置环境变量的意义(转)
    在Linux环境下搭建Tomcat+mysql+jdk环境(转)
    java环境变量
    varchar(8000) nvarchar(4000) varchar(max) nvarchar(max) 区别
    HTTP与HTTPS握手的那些事(转载)
    ELK研究-部署搭建运用
    主机规划与磁盘分区
    占位符问题 python pymysql
    django 数据迁移的问题 sqlite3 --> mysql
  • 原文地址:https://www.cnblogs.com/litifeng/p/5790707.html
Copyright © 2020-2023  润新知