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;
}
運行結果