C/C++ 宏定义高级用法

c/c++ 宏定义高级用法

1.ANSI标准五个预定义的宏名

    __LINE__ 表示该行代码的所在行号
    __FILE__ 表示源文件的文件名
    __DATE__ 表示源文件被编译的日期,格式(月/日/年)
    __TIME__ 表示源文件被编译成目标代码的时间,格式(时:分:秒)
    __STDC__ 表示编译器是否标准,标准时表示常量1,非标准则表示其它数字

测试用例

#include <stdio.h>
#include <stdlib.h>


#define INFO(msg) info_debug(__FILE__, __LINE__, __DATE__, __TIME__, msg)

void info_debug(const char* filename, int line, const char* date, const char* time, const char* msg)
{
	printf_s("info_debug %s:%d (%s-%s):%s", filename, line, date, time, msg);
}

int main()
{
	INFO("Hello world!\n");
	system("pause");
	return 0;
}

运行结果

2.不定参数的宏定义用法

__VA_ARGS__ 表示后面剩余的所有参数

具体用法

#define LOG(fmt, ...) log(__FILE__, __LINE__, fmt, __VA_ARGS__)

"..."表示后面省略的参数,__VA_ARGS__正好对应"..."的作用

测试用例

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>


#define INFO(msg) info_debug(__FILE__, __LINE__,  msg)
#define LOG(fmt, ...) log(__FILE__, __LINE__, fmt, __VA_ARGS__)

void info_debug(const char* filename, int line, const char* msg)
{
	printf_s("info_debug %s:%d :%s", filename, line, msg);
}

void log(const char* filename, int line, const char* fmt, ...)
{
	int size;
	char * msg = NULL;
	va_list args;
	va_start(args, fmt);
	size = vsnprintf(NULL, 0, fmt, args) + 1;
	msg = (char *)malloc(size);
	vsnprintf(msg, size, fmt, args);
	info_debug(filename, line, msg);
	free(msg);
	va_end(args);
}

int main()
{
	INFO("Hello world!\n");
	LOG("%s %d\n", "debug", 14);
	system("pause");
	return 0;
}

运行结果

3.# 与 ## 在宏定义的含义

#的功能是将其后面的宏参数进行字符串化操作,简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号

##被称为连接符,用来将两个Token连接为一个Token,##符是把传递过来的参数当成字符串进行替代

测试用例

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>


#define INFO(msg) info_debug(__FILE__, __LINE__,  msg)
#define LOG(fmt, ...) log(__FILE__, __LINE__, fmt, __VA_ARGS__)

#define VERSION 1.0.0
#define __STR__(x) (#x)  
#define TO_STR(x) __STR__(x)

#define LINK(x, y) x##y


void info_debug(const char* filename, int line, const char* msg)
{
	printf_s("info_debug %s:%d :%s", filename, line, msg);
}

void log(const char* filename, int line, const char* fmt, ...)
{
	int size;
	char * msg = NULL;
	va_list args;
	va_start(args, fmt);
	size = vsnprintf(NULL, 0, fmt, args) + 1;
	msg = (char *)malloc(size);
	vsnprintf(msg, size, fmt, args);
	info_debug(filename, line, msg);
	free(msg);
	va_end(args);
}

int main()
{
	INFO("Hello world!\n");
	LOG("%s %d\n", "debug", 14);
	printf_s("#把一个宏定义变成字符串:version = %s\n", TO_STR(VERSION));
	int n = LINK(12, 34);
	printf_s("##把两个参数拼接一起:%d\n", n);
	system("pause");
	return 0;
}

运行结果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章