宏开关

宏替换是在预处理时进行的

宏头文件

test.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef TEST_H
#define TEST_H
#include <QDebug>

#ifdef TEST_DEBUG_ON
#define LOG_PRINTF {qDebug()<<"test"<<__FILE__<<__FUNCTION__<<__LINE__;}

#define swap(x, y)\
x = x + y;\
y = x - y;\
x = x - y;

#else
#define LOG_PRINTF
#define swap(x,y)

#endif
#endif

使用宏处

1
2
3
4
5
6
7
8
#include "test.h"

#define TEST_DEBUG_ON

void fun()
{
LOG_PRINTF
}

不使用LOG_PRINTF时,注释#define TEST_DEBUG_ON

头文件多次包含问题

c/c++ 头文件多次包含,会出现重复定义的问题。
避免头文件多次包含的方式

  • 使用宏保护
    1
    2
    3
    4
    #ifndef TEST_H
    #define TEST_H

    #endif

测试 TEST_H 预处理器变量是否未定义。如果 SALESITEM_H 未定义,那么 #ifndef 测试成功,跟在#ifndef 后面的所有行都被执行,直到发现 #endif。相反,如果 TEST_H 已定义,那么 #ifndef 指示测试为假,该指示和 #endif 指示间的代码都被忽略。

  • 使用 #pragma once

c++中#pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档。