C/C++中的include的不一样的用法

403 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 << " ";