include .h的一部分_C++:#include和using namespace

在C++中,既有#include,又有using namespace。前者通常定义在.h文件中,后者直接写在.cpp文件中。#include用于添加文件到project中,而namespace使对象在逻辑模块中。

也即是:

#include用于引用其他文件的内容(如#include “a.h”),编译器在编译时,在使用include的文件中(如名为main.cpp),将include这句话替换为其文件内容,相当于物理上的复制替换。

//a.h

void fun();

当不同的两个文件中,使用了相同的函数名(a.h 和b.h两个文件中都有fun()),函数内容却不同,根据上文来看,如果使用include同时引用两个文件,则在编译时,mai.cpp文件中出现了两个fun(),因此重名,后面调用函数时也不知道调用的哪个函数。

那么,如何避免上面出现的问题呢?这就需要使用命名空间namespace,把两个函数定义在不同的命名空间中,然后在需要调用函数的文件中加入using namespace(注意#include也需要写),将当前使用的函数链接到它声明的地方。

772b0723-842e-eb11-8da9-e4434bdf6706.png
//a.cpp
namespace f1 {
	void fun()
	{
		int c = 0;
	}
}
//main.cpp
 #include "a.h"
 using namespace f1;
 int main()
 {
	fun();
 }

//或者
 #include "a.h"
 int main()
 {
	f1::fun();
 }

在上面的main.cpp中,第一种方法,使用 using namespace,则当前整个文件中使用的fun()都会链接到命名空间为f1的函数fun()中。那么如果在main.cpp文件中既想使用f1中的fun(),又想用f2(b.h的命名空间)中的fun(),则使用 using namespace链接两个命名空间吗?这会造成下面函数调用时依旧指向不明,会报链接错误。这时就需要使用上面的第二种方法,不在文件顶部使用using namespace,而是在调用函数时写出命名空间进行链接。

以下为C++: using namespace and #include的翻译内容

例如:你有一个向量类vector.h,则把它加入到project中。vector是标准库STD中的一部分,因此可以使用以下语句来进入向量类:

std::vector

然而,如果程序员由于懒而不想在所有地方写std::(标准库有非常多有用的地方),则可以在.cpp文件的顶部写:

using namespace std

这会告诉编译器,每次它看到一个类型(比如向量)时,还要检查命名空间std,因为定义可能在那里。这样,就等价于以下声明:

std::vector
vector

在vector.h中,会看到类似于下面的语句:

namespace std
{
    class vector { /* Implementation */ }
}

因此,#include是用于添加文件,而using namespace用于保持代码结构整洁干净,并将其打包在“有意义”的库中。当你编程时可以省略using namespace,但绝对需要使用#include。

---------------------

作者:路人甲JIA

来源:CSDN

原文:C++:#include和using namespace

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++#include <ros/ros.h> #include <ros/package.h> #include <quadrotor_msgs/PositionCommand.h> #include <nav_msgs/Odometry.h> #include <sensor_msgs/Joy.h> #include<mavros_msgs/AttitudeTarget.h> #include <tf/tf.h> #include <math.h> using namespace std; int main(int argc, char **argv) { ros::init(argc, argv, "traj_pub"); //##节点名traj_pub ros::NodeHandle nh; // ros::Publisher local_pos_pub3 = nh.advertise<quadrotor_msgs::PositionCommand> ("/position_cmd", 10); //##话题名字为/——position_cmd 10为缓存长度 quadrotor_msgs::PositionCommand poscom; //ros::Publisher local_pos_pub3 = nh.advertise<mavros_msgs::AttitudeTarget> // ("/mavros/setpoint_raw/attitude", 10); //mavros_msgs::AttitudeTarget msg; ros::Rate rate(20.0); //##循环频率20 int i = 0; while(ros::ok()) { poscom.position.x = 2.5*sin(M_PI*i/400); poscom.position.y = 5*sin(M_PI*i/800); poscom.position.z = 2; poscom.velocity.x = 0; poscom.velocity.y = 0; poscom.velocity.z = 0; poscom.acceleration.x = 0; poscom.acceleration.y = 0; poscom.acceleration.z = 0; poscom.yaw = 0; poscom.jerk.x=0; poscom.jerk.y=0; poscom.jerk.z=0; local_pos_pub3.publish(poscom); // tf::Quaternion q = tf::createQuaternionFromRPY(0, 0, 0.5); // msg.type_mask = msg.IGNORE_ROLL_RATE || msg.IGNORE_PITCH_RATE || msg.IGNORE_YAW_RATE; // msg.orientation.x = q.x(); // msg.orientation.y = q.y(); // msg.orientation.z = q.z(); // msg.orientation.w = q.w(); // msg.thrust = 0.75; // local_pos_pub3.publish(msg); ros::spinOnce(); rate.sleep(); i++; } } 转成pyrhon
06-11

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值