#include/#ifndef

1.#include指令

当预处理器发现#include指令时,会查看后面的文件名,把被包含文件的全部内容输入到源文件#include指令所在的位置。

(1)#include路径的两种形式:

../ 表示上级目录。

#include <studio.h>   //在标准系统目录中查找该文件
#include "mystuff.h"  //当前目录下的文件
#include "/usr/biff/p.h"  //查找/usr/biff目录
当前目录  C:\test1\test2
.\123.txt    ==C:\test1\test2\123.txt
..\123.txt    ==C:\test1\123.txt
eg.project/src/base/logging.h应该按照如下方式包含:
#include "base/logging.h"
当前 路径 E:\test\file
===================================================

1. 相对路径 ,用正斜杠’/‘

    1.1向上一级目录指向

    ./    表示当前路径,相当于E:\test\file

    ../  表示当前路径的上一级路径,相当于E:\test

    ../../  表示当前路径上上一级路径,相当于E:

    更多指向上级路径的表示以此类推。

    1.2 向下一级目录指向

    ./data  表示当前路径下一级路径,相当于E:\test\file\data

    ./data/xxx   表示当前路径的下下一级路径,相当于 E:\test\file\data\xxx

    更多向下指向的路径的表示以此类推。

 

2.绝对路径,用反斜杠'\'

   E:\test

   E:\test\file

   E:\test\file\data

 
(2)头文件的包含顺序
1.dir2/foo2.h(优先位置)
2.C系统文件
3.C++系统文件
4.其他库的.h文件
5.本项目内的.h文件

Src(源代码):该文件夹包含项目的源代码文件(.cpp、.c等)。这些文件包含实现程序逻辑的源代码。

Lib(库文件):这个文件夹通常用于存放项目所依赖的外部库文件(.lib、.dll等)。这些库文件提供了额外的功能和资源供项目使用。

Include(头文件):该文件夹通常用于存放项目的头文件(.h、.hpp等)。

Debug:包含与调试相关的文件

Service文件夹:服务类或模块
 

2.#ifndef,#ifndef和#if

#ifndef 和 #ifdef 是一种宏定义判断,作用是防止多重定义。#ifndef 是 if not define 的简写,#ifdef 是 if define 的简写。

a)在.h文件中

条件指示符#ifndef的主要目的是防止一个源文件两次包含同一个头文件。标识符的定义格式其实没有规定,最好全部是大写,为了好区分,最好以头文件名命名,然后加上下划线_,便于区分。

//a.h
#ifndef _A_H
#define _A_H

#include "b.h"

class A 
{
public:
    //...
private:
    //...
};

#endif 

 即使其他几个头文件中包含 a.h,但是就只处理一次,第二次处理时,A_H 这个宏已经存在,将不会在执行循环里的程序。很好的防止了重复声明。

#ifndef _YOUR_PROGRAM_NAME_H  //一般是文件名的大写
#define _YOUR_PROGRAM_NAME_H
XXXXXXXX
XXXXXXXX
XXXXXXXX   //程序段1,如果_YOUR_PROGRAM_NAME没有被宏定义过,则编译程序段1
#else
XXXXXXXX
XXXXXXXX
XXXXXXXX  //程序段2,如果_YOUR_PROGRAM_NAME被宏定义过,则编译程序段2
#endif  //终止if

条件指示符#ifndef的主要目的是防止一个源文件两次包含同一个头文件。

b.在.cpp文件中
1)做测试用
#include <bits/stdc++.h>

using namespace std;

#define IOI

int main()
{
#ifdef IOI
    cout << "999" << endl;
#endif
    return 0;
}

有时候当代码比较多的时候,要做测试,但是全部注释很麻烦,这时候使用#ifdef非常好用,如果我不想执行cout << "999" <<endl; 这段程序,只需要将上面的 #define IOI 注释就可以了。

2)不同场景的判断使用
#include <bits/stdc++.h>

using namespace std;

#define ADMIN 8

int main()
{
#if (ADMIN == 9)
    cout << "999" << endl;  //没有编译该语句
#else
    cout << "000" << endl;  //编译并执行了该语句
#endif
    return 0;
}

在cpp文件中,代替条件语句,对程序中的内容选择性的编译,根据一定的条件,选择只编译程序段1或程序段2,生成的目标程序较段。

//形式1
#ifndef 标识符
程序段 1
#else
程序段 2
#endif

//形式2
#ifndef 标识符
程序段 1
#endif
c.例子
#include <stdio.h>
 
#define YEARS_OLD 12
#ifndef YEARS_OLD
#define YEARS_OLD 10
#endif
 
int main()
{
   printf("TechOnTheNet is over %d years old.\n", YEARS_OLD);
 
   return 0;
}

在此示例中,如果在遇到 #ifndef 指令之前未定义宏 YEARS_OLD,则将其定义为值 10。

这是可执行程序的输出:

TechOnTheNet is over 12 years old.

 如果删除 #define YEARS_OLD 12 行,您将看到可执行程序的以下输出:

TechOnTheNet is over 10 years old.

getenc();用于获取运行该C++代码的当前用户的主目录,NUSP_HOME是环境变量,保存的是当前用户的主目录。将该环境变量转化为字符串,然后和相对目录拼接,即可得到完整的路径。如果环境变量没有设置,则会报错。

char *pHomeEnv=getenv("NUSP_HOME");
char logDir[256];
sprintf(logDir,"%s/var/log/myfile",pHomeEnv);

1.查看home的内容

echo $NUSP_HOME   
//输出为: /home/nusp

2.查看所有环境变量

printenv

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值