代码工程的创建——文件目录结构、变量的外部链接、名称空间

1.创建代码工程

(1)所包含的文件目录:

1)src:用于储存源代码文件
2)include:用于储存头文件
3)bin:用于储存生成的可执行文件
4)lib:用于储存生成的库文件
5)build:用于储存编译生成的中间文件
6)data:用于储存程序需要调用的文本、视频、图片等文件
7)CMakeLists.txt:用于书写cmake编译规则
在这里插入图片描述

(2)头文件的编写
1)头文件中一般可以包含的内容

-函数原型
-使用#define或const定义的符号常量
-结构声明
-类声明
-模板函数
-内联函数

2)头文件管理
使用#ifndef和#endif避免编译器对同一个头文件编译两次,以下代码指仅当之前没有使用预处理编译器指令#define定义名称PRACTICE_H_时,才处理#ifndef和#endif之间的内容。

当编译器首次遇到该文件时,名称PRACTICE_H_没有被定义,则编译器将查看#ifndef和#endif之间的内容,并读取定义PRACTICE_H_的一行(#define PRACTICE_H_);

如果在同一个文件中遇到其他包含practice.h的代码,编译器将知道PRACTICE_H_已经被定义了,从而跳到#endif后面的一行。

#ifndef PRACTICE_H_
#define PRACTICE_H_

//include contants

#endif

3)代码编译规则cmake
对于一些代码模块,可以将若干个代码文件编译成库,然后通过头文件的形式调用这个库的内容,则可以用cmake来对代码进行编译,而cmake通过CMakeLists.txt书写编译规则。
CMakeLists.txt

#设置cmake版本
cmake_minimum_required(VERSION 3.10)
#设置项目名称
project(test)
#将practice8.cpp编译成共享库
add_library(practice SHARED practice.cpp)
#添加将要编译的可执行文件
add_executable(${PROJECT_NAME} test.cpp)
#将共享库链接到可执行文件
target_link_libraries(${PROJECT_NAME} practice)

2.静态持续性、外部链接性

描述:在多个文件中使用同一个外部变量
单定义规则:变量只能有一次定义;

为实现在多个文件中使用同一个外部变量,只需在一个文件包含该变量的定义(单定义规则),通过引用声明,在使用该变量的其他所有文件中都必须使用关键字extern来声明它。

3.名称空间

(1)相关术语
**声明区域:**声明区域是可以在其中进行声明的区域。如在函数外面声明全剧变量,该变量的声明区域为其声明所在的文件;在函数中声明的变量其声明区域为其声明所在的代码块。
**潜在作用域:**变量的潜在作用域从声明点开始,到其声明区域的结尾。
**名称空间:**C++通过定义一种新的声明区域来创建命名的名称空间,目的在于提供一个声明名称的区域。一个名称空间中的名称不会与另一个名称空间的名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。最后通过使用作用域解析运算符::访问给定名称空间中的名称。
(2)名称空间的使用
创建名称空间

namespace Jack
{
	double pail;
	void fecth();
	int pal;
	struct Well{...};
}

namespace Jill
{
	double bucktet(double n){...}
	double  fecth();
	int pal;
	struct Hill{...};
}

使用名称空间中的名称
1)可以通过作用域解析运算符使用某个名称空间中的名称;

Jack::pail=12.4;
double result=Jill::fetch();

2)C++使用using声明和using编译指令简化对名称空间中名称的使用

using Jack::pal;

using namespace Jill;

示例代码

//test1.h
#include<iostream>

using namespace std;
namespace test1
{
    
int number=10;
    
void test();

}//end namespace test1
//test1.cpp
#include"test1.h"
namespace test1
{

void test()
{
    cout<<"Number in test1 is "<<number<<endl;
}
}//end namespace test1
//test2.h
#include<iostream>

using namespace std;

namespace test2
{
    
int number=20;

void test();

}//end namespace test2
//test2.cpp
#include"test2.h"
namespace test2
{

void test()
{

    cout<<"Number in test2 is "<<number<<endl;
}

}//end namespace test2
//main.cpp
#include"test1.h"
#include"test2.h"

extern int test1::number;
extern int test2::number;

int main()
{
    test1::test();
    test2::test();
    cout<<endl;
    
    test1::number=test1::number*2;
    test1::test();
    test2::test();
    cout<<endl;
    
    test2::number=test2::number*2;
    test1::test();
    test2::test();
    
    return 0;
}

输出结果

Number in test1 is 10
Number in test2 is 20

Number in test1 is 20
Number in test2 is 20

Number in test1 is 20
Number in test2 is 40
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值