C/C++ 中的宏使用笔记(MARCO)

C/C++ 中的宏使用笔记(MARCO)

宏指令

宏指令 宏解释
#include 引用头文件
#define 定义宏
#undef 取消宏定义
#ifndef 假如没有定义 等价于 #if !defined()
#ifdef 假如定义 等价于 #if defined()
#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

你可能感兴趣的:(C/C++,c++,c语言,开发语言)