您的位置:首页 > 编程语言 > C语言/C++

C语言宏信息介绍及实例

2013-03-09 09:57 169 查看
宏信息介绍:

  1) __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试(C99规范中新增)。

  2) __FILE__ 宏在预编译时会替换成当前的源文件名

  3) __LINE__宏在预编译时会替换成当前的行号

  4) __FUNCTION__宏在预编译时会替换成当前的函数名称

例子:

//debug.c

#include <stdio.h>

#include <string.h>

//开启下面的宏表示程序运行在调试版本, 否则为发行版本, 这里假设只有调试版本才输出调试信息

#define _DEBUG

#ifdef _DEBUG

    //开启下面的宏就把调试信息输出到文件,注释即输出到终端

    #define DEBUG_TO_FILE

    #ifdef DEBUG_TO_FILE

        //调试信息输出到以下文件

        #define DEBUG_FILE "/tmp/debugmsg"

        //调试信息的缓冲长度

        #define DEBUG_BUFFER_MAX 4096

        //将调试信息输出到文件中

        #define printDebugMsg(moduleName, format, ...) {\

            char buffer[DEBUG_BUFFER_MAX+1]={0};\

            snprintf( buffer, DEBUG_BUFFER_MAX,\

               "[%s] "format" File:%s, Line:%d,moduleName\n", ##__VA_ARGS__, __FILE__, __LINE__ );\

            FILE* fd = fopen(DEBUG_FILE, "a");\

            if ( fd != NULL ) {\

                fwrite( buffer, strlen(buffer), 1, fd );\

                fflush( fd );\

                fclose( fd );\

            }\

        }

    #else

        //将调试信息输出到终端

        #define printDebugMsg(moduleName, format, ...) \

                  printf( "[%s] "format" File:%s, Line:%d\n", moduleName, ##__VA_ARGS__, __FILE__, __LINE__ );

    #endif //end for #ifdef DEBUG_TO_FILE

#else

    //发行版本

    #define printDebugMsg(moduleName, format, ...)

#endif //end for #ifdef _DEBUG

int main(int argc, char** argv)

{

    char *pStr = "hello world";

    printDebugMsg( "TestProgram", "Str = %s", pStr );

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: