C/C++ 中的宏使用笔记(MARCO)
宏指令
宏指令 | 宏解释 |
---|---|
#include | 引用头文件 |
#define | 定义宏 |
#undef | 取消宏定义 |
#ifndef | 假如没有定义 等价于 #if !defined(<MARCO>) |
#ifdef | 假如定义 等价于 #if defined(<MARCO>) |
#else | 否则 |
#elif | 否则假如 |
#endif | if或else的结束 |
#pragma | 编译指示 |
预定义宏
预定义宏 | 解释 |
---|---|
__LINE__ | 当前编译的代码的行号 |
__FILE__ | 当前编译文件的源文件名 |
__DATE__ | 当前源程序创建的日期 |
__TIME__ | 当前源程序创建的时间 |
__STDC__ | c++17 判断当前的编译器是否为标准C编译器,若是则返回值1 |
__STDC__HOSTED__ | c++11 是否托管环境 |
__STDC_VERSION__ | c++11 C 标准的版本号 |
__OBJC__ | c++11 是否Objective-C 编译器 |
__ASSEMBLER__ | c++11 预处理汇编语言时定义为值 1 |
更多的预定义宏参考链接:
https://gcc.gnu.org/onlinedocs/cpp/Predefined-Macros.html
http://www.cppblog.com/bellgrade/archive/2010/03/18/110030.html
常见用法
定义宏
#define MARCO
定义宏为一个值
#define MARCO 123
定义宏为一个函数
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))
宏置换(#)
我的编译器测试不同过,可能不管用
#define PRINTFX(YYDX) \
do \
{ \
printf("#YYDX:%s\n", YYDX); \
} while (0)
宏拼接(##)
#define NAME(a,b) a##b
C风格编译
#ifdef __cplusplus
extern "C" {
#endif
// <代码段>
#ifdef __cplusplus
}
#endif
条件编译
#if defined(__STDC__) && (__STDC__ >= 1)
// <代码段>
#endif /* __STDC__ >= 1 */
选择性编译
#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \
((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \
!defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK)
// <代码段1>
#else
// <代码段2>
#endif /* gcc >= 4.3 && !__cplusplus */
编译一次
#ifndef __STL_MARCO_H__
#define __STL_MARCO_H__
// <代码段>
#endif /* __STL_MARCO_H__ */
#pragma once
pragma
#pragma pack(1)
#pragma pack(push, 8)
#pragma pack(pop)
#pragma warning(push)
#pragma warning(pop)
#pragma warning(disable:4996)
#pragma warning(disable:4251)
#ifdef __clang__
#pragma clang diagnostic pop
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdocumentation"
#endif