持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情
说起c/c++中的include,你一定不陌生,在学习c/c++第一课时你就会接触到#include<stdio.h>这样的语句
用#开头的代表的是宏命令,是一个预处理的过程。
#include是一种文本预处理命令,把该处的文件给原封不动的复制到本处来。
当然了,你也可以包含自身
//test.cpp
#include "test.cpp"
int main() {}
试试看?你的编译结果?
#include 有两种用法,一种是<>代表指定从库文件处引入,一种是""表示从当前目录引入
多次#include有时候也会有烦恼,会重复的引入一次,在编译一个项目时,只需要存在一份即可,不需要存在多分。
这个时候,就有了我们熟悉的防卫式声明头文件:
// test.h
#ifndef LIN_TEST_H_
#define LIN_TEST_H_
namespace lin {
};
#endif
那么,include的一般用法是用来引入我们的声明,这样,我们就可以把声明和实现分开写
方便了多文件编译,链接
这是大型项目的基石(你也不想一个文件编辑器打开要5分钟吧!)
题外话,C++和c语言头文件是如何实现复用的呢?
答:
#ifdef __cplusplus
extern "C" {
#endif
void foo() {}
void bar() {}
#ifdef __cplusplus
}
#endif
那么,上述是include一般常用的用法,它还可以干些什么呢?
引入文本,欸,别说,引入文本好像可以抽离一些东西从代码中出去
我们配合c/c++里面的初始化列表的指定成员初始化,就可以实现一个导出形式的config了!
#include <bits/stdc++.h>
struct Config {
std::string devName = "not name";
std::string sqlName = "xxx name";
std::string password = "None";
struct{
enum protocol { IPV4, IPV6 };
protocol protocol = IPV4;
std::string Addr = "0.0.0.0";
std::string port = "80";
}Ip;
};
int main() {
Config config{
#include "config"
};
std::cout << config.devName << " \n"
<< config.sqlName << " \n"
<< config.password << " \n"
<< config.Ip.Addr << " " << config.Ip.port << " \n";
return 0;
}
.devName = "mysql",
.sqlName = "user",
.password = "123",
.Ip = {
.Addr = "127.0.0.1",
.port = "3306"
}
有什么好处呢?
好处是在简化了本身的代码,把一些配置代码抽离开来
并且整个是在编译期执行的,不会对parse造成负担
配置文件为什么一定得用Json呢?我可以自己利用“小聪明”来完成这件事情呢
还可以干一些事情,比如导入数据:
std::vector<std::string> ve{
#include "data"
};
for (auto v : ve)
std::cout << v << " ";