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