ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c语言,宏相关

2021-12-01 13:34:09  阅读:179  来源: 互联网

标签:__ ... 语言 VA ARGS debug 相关 define


文章目录

1,防止一个头文件被重复包含

#ifndef BODYDEF_H
#define BODYDEF_H
//头文件内容
#endif

2,得到指定地址上的一个字节或字

#define  MEM_B( x )  ( *( (char* ) (x) ) )
#define  MEM_W( x )  ( *( (short* ) (x) ) )

3,得到一个field在结构体(struct)中的偏移量

#define FPOS( type, field ) ( (int) &(( type *) 0)->field )

4,使用一些宏跟踪调试

_LINE_ (两个下划线),对应%d
_FILE_     对应%s
_DATE_   对应%s
_TIME_    对应%s
#include <stdio.h>

#define debug(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)

// __VA_ARGS__ 为("..."对应的内容) 
int main(void)
{ 
	// 输出为
	// Dec  1 2021,05:12:28
	debug("%s,%s\n", __DATE__, __TIME__);
	return 0;
}

5,字符串化# 和 宏连接符##

起飞

6,常用于内核的填充结构相关代码

#define  FILL(a)   {a, #a}

enum IDD{OPEN, CLOSE};
typedef struct MSG{
  IDD id;
  const char * msg;
}MSG;

MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};
// 相当于:
// MSG _msg[] = { {OPEN, "OPEN"}, {CLOSE, "CLOSE"} };

7,可变参数传递

  • 1、 __VA_ARGS__
    __VA_ARGS__ 就是 "..." 表示的内容
#define debug(format, ...) fprintf(stderr, fmt, __VA_ARGS__)

在GCC中也支持这类表示, 但是在G++ 中不支持这个表示.
例程

#include <stdio.h>

#define debug(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)

// __VA_ARGS__ 为("..."对应的内容) 
int main(void)
{ 
    // 输出:Dec  1 2021,05:12:28
	debug("%s,%s\n", __DATE__, __TIME__);
	return 0;
}
  • 2、GCC 的复杂宏

GCC使用一种不同的语法从而可以使你可以给可变参数一个名字,如同其它参数一样。

#define debug(format, args...) fprintf (stderr, format, args)

这和上面举的那个定义的宏例子是完全一样的,但是这么写可读性更强并且更容易进行描述。

标签:__,...,语言,VA,ARGS,debug,相关,define
来源: https://blog.csdn.net/engineer0/article/details/121653078

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有