确实是会基于msg文件生成对应头文件,打开头文件,一切都明了了。

比如这是DroneState.msg对应生成的头文件DroneState.h,是在devel文件夹下面,是编译生成的。这里一开头就明确定义了工作空间namespace,以后再看到prometheus_msgs::DroneSate就不会有疑问了,我一直对这个细节抓着不放彻底弄明白弄清楚是对的,是可以真正完全弄清楚的。看来msg文件可以写那么简单完全是为了方便我们啊,实际的头文件内容还是非常多的。

// Generated by gencpp from file prometheus_msgs/DroneState.msg
// DO NOT EDIT!#ifndef PROMETHEUS_MSGS_MESSAGE_DRONESTATE_H
#define PROMETHEUS_MSGS_MESSAGE_DRONESTATE_H#include <string>
#include <vector>
#include <map>#include <ros/types.h>
#include <ros/serialization.h>
#include <ros/builtin_message_traits.h>
#include <ros/message_operations.h>#include <std_msgs/Header.h>
#include <geometry_msgs/Quaternion.h>namespace prometheus_msgs
{
template <class ContainerAllocator>
struct DroneState_
{typedef DroneState_<ContainerAllocator> Type;DroneState_(): header(), connected(false), armed(false), landed(false), mode(), time_from_start(0.0), position(), velocity(), attitude(), attitude_q(), attitude_rate()  {position.assign(0.0);velocity.assign(0.0);attitude.assign(0.0);attitude_rate.assign(0.0);}DroneState_(const ContainerAllocator& _alloc): header(_alloc), connected(false), armed(false), landed(false), mode(_alloc), time_from_start(0.0), position(), velocity(), attitude(), attitude_q(_alloc), attitude_rate()  {(void)_alloc;position.assign(0.0);velocity.assign(0.0);attitude.assign(0.0);attitude_rate.assign(0.0);}typedef  ::std_msgs::Header_<ContainerAllocator>  _header_type;_header_type header;typedef uint8_t _connected_type;_connected_type connected;typedef uint8_t _armed_type;_armed_type armed;typedef uint8_t _landed_type;_landed_type landed;typedef std::basic_string<char, std::char_traits<char>, typename ContainerAllocator::template rebind<char>::other >  _mode_type;_mode_type mode;typedef float _time_from_start_type;_time_from_start_type time_from_start;typedef boost::array<float, 3>  _position_type;_position_type position;typedef boost::array<float, 3>  _velocity_type;_velocity_type velocity;typedef boost::array<float, 3>  _attitude_type;_attitude_type attitude;typedef  ::geometry_msgs::Quaternion_<ContainerAllocator>  _attitude_q_type;_attitude_q_type attitude_q;typedef boost::array<float, 3>  _attitude_rate_type;_attitude_rate_type attitude_rate;typedef boost::shared_ptr< ::prometheus_msgs::DroneState_<ContainerAllocator> > Ptr;typedef boost::shared_ptr< ::prometheus_msgs::DroneState_<ContainerAllocator> const> ConstPtr;}; // struct DroneState_typedef ::prometheus_msgs::DroneState_<std::allocator<void> > DroneState;typedef boost::shared_ptr< ::prometheus_msgs::DroneState > DroneStatePtr;
typedef boost::shared_ptr< ::prometheus_msgs::DroneState const> DroneStateConstPtr;// constants requiring out of line definitiontemplate<typename ContainerAllocator>
std::ostream& operator<<(std::ostream& s, const ::prometheus_msgs::DroneState_<ContainerAllocator> & v)
{
ros::message_operations::Printer< ::prometheus_msgs::DroneState_<ContainerAllocator> >::stream(s, "", v);
return s;
}template<typename ContainerAllocator1, typename ContainerAllocator2>
bool operator==(const ::prometheus_msgs::DroneState_<ContainerAllocator1> & lhs, const ::prometheus_msgs::DroneState_<ContainerAllocator2> & rhs)
{return lhs.header == rhs.header &&lhs.connected == rhs.connected &&lhs.armed == rhs.armed &&lhs.landed == rhs.landed &&lhs.mode == rhs.mode &&lhs.time_from_start == rhs.time_from_start &&lhs.position == rhs.position &&lhs.velocity == rhs.velocity &&lhs.attitude == rhs.attitude &&lhs.attitude_q == rhs.attitude_q &&lhs.attitude_rate == rhs.attitude_rate;
}template<typename ContainerAllocator1, typename ContainerAllocator2>
bool operator!=(const ::prometheus_msgs::DroneState_<ContainerAllocator1> & lhs, const ::prometheus_msgs::DroneState_<ContainerAllocator2> & rhs)
{return !(lhs == rhs);
}} // namespace prometheus_msgsnamespace ros
{
namespace message_traits
{template <class ContainerAllocator>
struct IsFixedSize< ::prometheus_msgs::DroneState_<ContainerAllocator> >: FalseType{ };template <class ContainerAllocator>
struct IsFixedSize< ::prometheus_msgs::DroneState_<ContainerAllocator> const>: FalseType{ };template <class ContainerAllocator>
struct IsMessage< ::prometheus_msgs::DroneState_<ContainerAllocator> >: TrueType{ };template <class ContainerAllocator>
struct IsMessage< ::prometheus_msgs::DroneState_<ContainerAllocator> const>: TrueType{ };template <class ContainerAllocator>
struct HasHeader< ::prometheus_msgs::DroneState_<ContainerAllocator> >: TrueType{ };template <class ContainerAllocator>
struct HasHeader< ::prometheus_msgs::DroneState_<ContainerAllocator> const>: TrueType{ };template<class ContainerAllocator>
struct MD5Sum< ::prometheus_msgs::DroneState_<ContainerAllocator> >
{static const char* value(){return "2e58976f7e6bb6fb3559cb004475bce0";}static const char* value(const ::prometheus_msgs::DroneState_<ContainerAllocator>&) { return value(); }static const uint64_t static_value1 = 0x2e58976f7e6bb6fbULL;static const uint64_t static_value2 = 0x3559cb004475bce0ULL;
};template<class ContainerAllocator>
struct DataType< ::prometheus_msgs::DroneState_<ContainerAllocator> >
{static const char* value(){return "prometheus_msgs/DroneState";}static const char* value(const ::prometheus_msgs::DroneState_<ContainerAllocator>&) { return value(); }
};template<class ContainerAllocator>
struct Definition< ::prometheus_msgs::DroneState_<ContainerAllocator> >
{static const char* value(){return "std_msgs/Header header\n"
"\n"
"## 机载电脑是否连接上飞控,true已连接,false则不是\n"
"bool connected\n"
"## 是否解锁,true为已解锁,false则不是\n"
"bool armed\n"
"## 是否降落,true为已降落,false则代表在空中\n"
"bool landed\n"
"## PX4飞控当前飞行模式\n"
"string mode\n"
"\n"
"## 系统启动时间\n"
"float32 time_from_start             ## [s]\n"
"\n"
"## 无人机状态量:位置、速度、姿态\n"
"float32[3] position                 ## [m]\n"
"float32[3] velocity                 ## [m/s]\n"
"float32[3] attitude                 ## [rad]\n"
"geometry_msgs/Quaternion attitude_q ## 四元数\n"
"float32[3] attitude_rate            ## [rad/s]\n"
"================================================================================\n"
"MSG: std_msgs/Header\n"
"# Standard metadata for higher-level stamped data types.\n"
"# This is generally used to communicate timestamped data \n"
"# in a particular coordinate frame.\n"
"# \n"
"# sequence ID: consecutively increasing ID \n"
"uint32 seq\n"
"#Two-integer timestamp that is expressed as:\n"
"# * stamp.sec: seconds (stamp_secs) since epoch (in Python the variable is called 'secs')\n"
"# * stamp.nsec: nanoseconds since stamp_secs (in Python the variable is called 'nsecs')\n"
"# time-handling sugar is provided by the client library\n"
"time stamp\n"
"#Frame this data is associated with\n"
"string frame_id\n"
"\n"
"================================================================================\n"
"MSG: geometry_msgs/Quaternion\n"
"# This represents an orientation in free space in quaternion form.\n"
"\n"
"float64 x\n"
"float64 y\n"
"float64 z\n"
"float64 w\n"
;}static const char* value(const ::prometheus_msgs::DroneState_<ContainerAllocator>&) { return value(); }
};} // namespace message_traits
} // namespace rosnamespace ros
{
namespace serialization
{template<class ContainerAllocator> struct Serializer< ::prometheus_msgs::DroneState_<ContainerAllocator> >{template<typename Stream, typename T> inline static void allInOne(Stream& stream, T m){stream.next(m.header);stream.next(m.connected);stream.next(m.armed);stream.next(m.landed);stream.next(m.mode);stream.next(m.time_from_start);stream.next(m.position);stream.next(m.velocity);stream.next(m.attitude);stream.next(m.attitude_q);stream.next(m.attitude_rate);}ROS_DECLARE_ALLINONE_SERIALIZER}; // struct DroneState_} // namespace serialization
} // namespace rosnamespace ros
{
namespace message_operations
{template<class ContainerAllocator>
struct Printer< ::prometheus_msgs::DroneState_<ContainerAllocator> >
{template<typename Stream> static void stream(Stream& s, const std::string& indent, const ::prometheus_msgs::DroneState_<ContainerAllocator>& v){s << indent << "header: ";s << std::endl;Printer< ::std_msgs::Header_<ContainerAllocator> >::stream(s, indent + "  ", v.header);s << indent << "connected: ";Printer<uint8_t>::stream(s, indent + "  ", v.connected);s << indent << "armed: ";Printer<uint8_t>::stream(s, indent + "  ", v.armed);s << indent << "landed: ";Printer<uint8_t>::stream(s, indent + "  ", v.landed);s << indent << "mode: ";Printer<std::basic_string<char, std::char_traits<char>, typename ContainerAllocator::template rebind<char>::other > >::stream(s, indent + "  ", v.mode);s << indent << "time_from_start: ";Printer<float>::stream(s, indent + "  ", v.time_from_start);s << indent << "position[]" << std::endl;for (size_t i = 0; i < v.position.size(); ++i){s << indent << "  position[" << i << "]: ";Printer<float>::stream(s, indent + "  ", v.position[i]);}s << indent << "velocity[]" << std::endl;for (size_t i = 0; i < v.velocity.size(); ++i){s << indent << "  velocity[" << i << "]: ";Printer<float>::stream(s, indent + "  ", v.velocity[i]);}s << indent << "attitude[]" << std::endl;for (size_t i = 0; i < v.attitude.size(); ++i){s << indent << "  attitude[" << i << "]: ";Printer<float>::stream(s, indent + "  ", v.attitude[i]);}s << indent << "attitude_q: ";s << std::endl;Printer< ::geometry_msgs::Quaternion_<ContainerAllocator> >::stream(s, indent + "  ", v.attitude_q);s << indent << "attitude_rate[]" << std::endl;for (size_t i = 0; i < v.attitude_rate.size(); ++i){s << indent << "  attitude_rate[" << i << "]: ";Printer<float>::stream(s, indent + "  ", v.attitude_rate[i]);}}
};} // namespace message_operations
} // namespace ros#endif // PROMETHEUS_MSGS_MESSAGE_DRONESTATE_H

我任打开一个其他的话题消息的头文件,每个都写了namespace prometheus_msgs

我似乎也搜到了对应的头文件

http://docs.ros.org/en/diamondback/api/geometry_msgs/html/Pose_8h_source.html

00001 /* Auto-generated by genmsg_cpp for file /tmp/buildd/ros-diamondback-common-msgs-1.4.0/debian/ros-diamondback-common-msgs/opt/ros/diamondback/stacks/common_msgs/geometry_msgs/msg/Pose.msg */
00002 #ifndef GEOMETRY_MSGS_MESSAGE_POSE_H
00003 #define GEOMETRY_MSGS_MESSAGE_POSE_H
00004 #include <string>
00005 #include <vector>
00006 #include <ostream>
00007 #include "ros/serialization.h"
00008 #include "ros/builtin_message_traits.h"
00009 #include "ros/message_operations.h"
00010 #include "ros/message.h"
00011 #include "ros/time.h"
00012
00013 #include "geometry_msgs/Point.h"
00014 #include "geometry_msgs/Quaternion.h"
00015
00016 namespace geometry_msgs
00017 {
00018 template <class ContainerAllocator>
00019 struct Pose_ : public ros::Message
00020 {
00021   typedef Pose_<ContainerAllocator> Type;
00022
00023   Pose_()
00024   : position()
00025   , orientation()
00026   {
00027   }
00028
00029   Pose_(const ContainerAllocator& _alloc)
00030   : position(_alloc)
00031   , orientation(_alloc)
00032   {
00033   }
00034
00035   typedef  ::geometry_msgs::Point_<ContainerAllocator>  _position_type;
00036    ::geometry_msgs::Point_<ContainerAllocator>  position;
00037
00038   typedef  ::geometry_msgs::Quaternion_<ContainerAllocator>  _orientation_type;
00039    ::geometry_msgs::Quaternion_<ContainerAllocator>  orientation;
00040
00041
00042 private:
00043   static const char* __s_getDataType_() { return "geometry_msgs/Pose"; }
00044 public:
00045   ROS_DEPRECATED static const std::string __s_getDataType() { return __s_getDataType_(); }
00046
00047   ROS_DEPRECATED const std::string __getDataType() const { return __s_getDataType_(); }
00048
00049 private:
00050   static const char* __s_getMD5Sum_() { return "e45d45a5a1ce597b249e23fb30fc871f"; }
00051 public:
00052   ROS_DEPRECATED static const std::string __s_getMD5Sum() { return __s_getMD5Sum_(); }
00053
00054   ROS_DEPRECATED const std::string __getMD5Sum() const { return __s_getMD5Sum_(); }
00055
00056 private:
00057   static const char* __s_getMessageDefinition_() { return "# A representation of pose in free space, composed of postion and orientation. \n\
00058 Point position\n\
00059 Quaternion orientation\n\
00060 \n\
00061 ================================================================================\n\
00062 MSG: geometry_msgs/Point\n\
00063 # This contains the position of a point in free space\n\
00064 float64 x\n\
00065 float64 y\n\
00066 float64 z\n\
00067 \n\
00068 ================================================================================\n\
00069 MSG: geometry_msgs/Quaternion\n\
00070 # This represents an orientation in free space in quaternion form.\n\
00071 \n\
00072 float64 x\n\
00073 float64 y\n\
00074 float64 z\n\
00075 float64 w\n\
00076 \n\
00077 "; }
00078 public:
00079   ROS_DEPRECATED static const std::string __s_getMessageDefinition() { return __s_getMessageDefinition_(); }
00080
00081   ROS_DEPRECATED const std::string __getMessageDefinition() const { return __s_getMessageDefinition_(); }
00082
00083   ROS_DEPRECATED virtual uint8_t *serialize(uint8_t *write_ptr, uint32_t seq) const
00084   {
00085     ros::serialization::OStream stream(write_ptr, 1000000000);
00086     ros::serialization::serialize(stream, position);
00087     ros::serialization::serialize(stream, orientation);
00088     return stream.getData();
00089   }
00090
00091   ROS_DEPRECATED virtual uint8_t *deserialize(uint8_t *read_ptr)
00092   {
00093     ros::serialization::IStream stream(read_ptr, 1000000000);
00094     ros::serialization::deserialize(stream, position);
00095     ros::serialization::deserialize(stream, orientation);
00096     return stream.getData();
00097   }
00098
00099   ROS_DEPRECATED virtual uint32_t serializationLength() const
00100   {
00101     uint32_t size = 0;
00102     size += ros::serialization::serializationLength(position);
00103     size += ros::serialization::serializationLength(orientation);
00104     return size;
00105   }
00106
00107   typedef boost::shared_ptr< ::geometry_msgs::Pose_<ContainerAllocator> > Ptr;
00108   typedef boost::shared_ptr< ::geometry_msgs::Pose_<ContainerAllocator>  const> ConstPtr;
00109 }; // struct Pose
00110 typedef  ::geometry_msgs::Pose_<std::allocator<void> > Pose;
00111
00112 typedef boost::shared_ptr< ::geometry_msgs::Pose> PosePtr;
00113 typedef boost::shared_ptr< ::geometry_msgs::Pose const> PoseConstPtr;
00114
00115
00116 template<typename ContainerAllocator>
00117 std::ostream& operator<<(std::ostream& s, const  ::geometry_msgs::Pose_<ContainerAllocator> & v)
00118 {
00119   ros::message_operations::Printer< ::geometry_msgs::Pose_<ContainerAllocator> >::stream(s, "", v);
00120   return s;}
00121
00122 } // namespace geometry_msgs
00123
00124 namespace ros
00125 {
00126 namespace message_traits
00127 {
00128 template<class ContainerAllocator>
00129 struct MD5Sum< ::geometry_msgs::Pose_<ContainerAllocator> > {
00130   static const char* value()
00131   {
00132     return "e45d45a5a1ce597b249e23fb30fc871f";
00133   }
00134
00135   static const char* value(const  ::geometry_msgs::Pose_<ContainerAllocator> &) { return value(); }
00136   static const uint64_t static_value1 = 0xe45d45a5a1ce597bULL;
00137   static const uint64_t static_value2 = 0x249e23fb30fc871fULL;
00138 };
00139
00140 template<class ContainerAllocator>
00141 struct DataType< ::geometry_msgs::Pose_<ContainerAllocator> > {
00142   static const char* value()
00143   {
00144     return "geometry_msgs/Pose";
00145   }
00146
00147   static const char* value(const  ::geometry_msgs::Pose_<ContainerAllocator> &) { return value(); }
00148 };
00149
00150 template<class ContainerAllocator>
00151 struct Definition< ::geometry_msgs::Pose_<ContainerAllocator> > {
00152   static const char* value()
00153   {
00154     return "# A representation of pose in free space, composed of postion and orientation. \n\
00155 Point position\n\
00156 Quaternion orientation\n\
00157 \n\
00158 ================================================================================\n\
00159 MSG: geometry_msgs/Point\n\
00160 # This contains the position of a point in free space\n\
00161 float64 x\n\
00162 float64 y\n\
00163 float64 z\n\
00164 \n\
00165 ================================================================================\n\
00166 MSG: geometry_msgs/Quaternion\n\
00167 # This represents an orientation in free space in quaternion form.\n\
00168 \n\
00169 float64 x\n\
00170 float64 y\n\
00171 float64 z\n\
00172 float64 w\n\
00173 \n\
00174 ";
00175   }
00176
00177   static const char* value(const  ::geometry_msgs::Pose_<ContainerAllocator> &) { return value(); }
00178 };
00179
00180 template<class ContainerAllocator> struct IsFixedSize< ::geometry_msgs::Pose_<ContainerAllocator> > : public TrueType {};
00181 } // namespace message_traits
00182 } // namespace ros
00183
00184 namespace ros
00185 {
00186 namespace serialization
00187 {
00188
00189 template<class ContainerAllocator> struct Serializer< ::geometry_msgs::Pose_<ContainerAllocator> >
00190 {
00191   template<typename Stream, typename T> inline static void allInOne(Stream& stream, T m)
00192   {
00193     stream.next(m.position);
00194     stream.next(m.orientation);
00195   }
00196
00197   ROS_DECLARE_ALLINONE_SERIALIZER;
00198 }; // struct Pose_
00199 } // namespace serialization
00200 } // namespace ros
00201
00202 namespace ros
00203 {
00204 namespace message_operations
00205 {
00206
00207 template<class ContainerAllocator>
00208 struct Printer< ::geometry_msgs::Pose_<ContainerAllocator> >
00209 {
00210   template<typename Stream> static void stream(Stream& s, const std::string& indent, const  ::geometry_msgs::Pose_<ContainerAllocator> & v)
00211   {
00212     s << indent << "position: ";
00213 s << std::endl;
00214     Printer< ::geometry_msgs::Point_<ContainerAllocator> >::stream(s, indent + "  ", v.position);
00215     s << indent << "orientation: ";
00216 s << std::endl;
00217     Printer< ::geometry_msgs::Quaternion_<ContainerAllocator> >::stream(s, indent + "  ", v.orientation);
00218   }
00219 };
00220
00221
00222 } // namespace message_operations
00223 } // namespace ros
00224
00225 #endif // GEOMETRY_MSGS_MESSAGE_POSE_H
00226 

细看一下它类里面其实就是写个结构体,所以可以像下面这么写

geometry_msgs::Pose pose

pose.position.x

pose是对象名,position可能是结构体,感觉似乎又不对

讲道理一个消息就是一种类,你包含了其他的消息就是包含了其他的类啊,

所以你看pose这个消息的头文件里面是include了的poin和quaternion这两个消息的头文件的

上面写的struct似乎也是定义类的。

这应该就是一个函数。这应该是多重继承的写法

http://m.biancheng.net/view/2277.html

这也应该是继承的写法。

我想起java是不能多重继承的,得用接口,是不是C++可以多重继承。

而且我刚刚发现上面正是多重继承下的构造函数!!!!!Pose_()正是构造函数!!!!!

http://m.biancheng.net/view/2277.html

所以ROS里面一个消息类型是由其他小消息类型组合而成的,在C++层面上是通过多重继承实现的。

http://docs.ros.org/en/diamondback/api/geometry_msgs/html/PoseStamped_8h.html

从这里也可以看出  geometry_msgs  确实就是个功能包,我理解得没有错,话题消息的定义都是写在一个专门的功能包里面的

http://wiki.ros.org/geometry_msgs

我现在知道使用ROS话题消息的功能包的命名空间是在哪里定义的了相关推荐

  1. 【RK3399Pro学习笔记】八、ROS话题消息的定义与使用

    目录 自定义话题消息 定义msg文件 在package.xml中添加功能包依赖 在CMakeLists.txt添加编译选项 编译 结果 使用 C++ 编写程序 person_publisher.cpp ...

  2. ROS中工作空间和功能包的创建以及发布者Publisher的实现

    最近刚刚开始学习ROS,对于整个ROS的框架和功能正在一点点的了解,跟着B站古月居的<ROS入门21讲>课程,在安装好linux和ROS后,正式开始ROS的学习,动手实践敲代码,在这里先记 ...

  3. 【RK3399Pro学习笔记】四、ROS 创建工作空间与功能包

    目录 创建工作空间 编译工作空间 功能包 创建功能包 编译功能包 设置环境变量 检查环境变量 平台:华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本:Tinker_Edge_R ...

  4. 在新建好的ROS空间里面添加功能包

    第一步:创建功能包 cd catkin_ws 打开src ~/catkin_ws/src 新建文件夹名字 catkin_create_pkg (文件加名字) roscpp rospy std_msgs ...

  5. 【一学就会的ROS基础入门教程 】03-1 ROS基础编程:ROS工作空间的创建、话题topic的发布与接收、以及话题消息的自定义使用

    [一学就会的ROS基础入门教程 ]03-1 ROS基础编程:ROS工作空间的创建.话题topic的发布与接收.以及话题消息的自定义使用 文前白话 1.创建工作空间与功能包 关于工作空间的介绍 创建开发 ...

  6. ros中自定义msg消息并用其他功能包调用

    注:本篇文章仅作为学习笔记,如有侵权,请联系删除. 目录 一.创建msg消息 1.在src目录创建自定义的msg功能包. 2.修改自定义msg功能包内的package.xml文件 3.修改自定义msg ...

  7. ROS话题的订阅与发布

    文章目录 前言 一.新建一个ROS工作空间并创建功能包 二.创建一个msg消息 三.发布话题 四.订阅话题 前言 Ubuntu18.04 ROS Melodic 一.新建一个ROS工作空间并创建功能包 ...

  8. ROS Noetic入门笔记(二)ROS Noetic创建工作空间和功能包

    ROS Noetic入门笔记(一)在ubuntu20.04中安装ROS Noetic并简单测试 ROS Noetic入门笔记(二)ROS Noetic创建工作空间和功能包 ROS Noetic入门笔记 ...

  9. ROS入门-7.创建工作空间与功能包

    一.工作空间 概述:是一个存放工程开发相关文件的文件夹 包括四个主要文件夹 src(代码空间):用来放置功能包,功能包的代码,配置文件,launch文件等 build(编译空间):放置编译过程当中产生 ...

最新文章

  1. 一篇漫画带你了解 Linux 内核长啥样!
  2. 日子是过以后、不是过从前
  3. python程序流程控制_python流程控制
  4. 第七节 VMware View 6.0 菜鸟入门 Composer 安装和部署
  5. python连接mongodb数据库_python连接mongodb操作数据示例(mongodb数据库配置类)
  6. android线程优先级大小,android 设置线程优先级 两种方式
  7. Python 输入一些数,统计最大值及其出现的频率,求一个数的全部质因数
  8. [Alpha阶段]第二次Scrum Meeting
  9. FreeWheel业务系统微服务化过程经验分享
  10. 面试题:谈谈你对Mysql数据库优化的见解
  11. Javaweb 网上订餐系统
  12. CSS3 transition改变内联样式无效的原因
  13. 微信开发之图灵机器人API接口调用
  14. 石河子大学计算机专业录取分数线,石河子大学2020年录取分数线(附2017-2020年分数线)...
  15. 22考研全年备考规划表,这5个时间点你必须知道!
  16. 好男儿当生三国 好女子当养唐朝
  17. 敢为人先,华为不惧C语言开发仓颉汉语编程,中文编程迎来新生态
  18. 圆桌骑士(点双联通分量+二分图判定)
  19. MacBook Pro使用初体验之Mac快捷键汇总(持续更新中)
  20. Java8新特性之consumer的用法

热门文章

  1. 基于51单片机和霍尔传感器的测速
  2. apriori算法 c语言,数据挖掘算法——Apriori算法
  3. NOIP 2016普及组复赛C/C++详细题解报告
  4. 教妹学Java:Java 程序在编译期发生了什么?
  5. linux安装宝塔一半挂了怎么再继续,宝塔安装到一半,连接断开了
  6. Python黑科技——暴力破解邻居家的WiFi密码,用WiFi不需要求人
  7. 参数方程中参数的意义: 参数方程定义: 什么是参数方程: 参数方程与普通方程的公式
  8. linux ping只显示一条,Linux ping命令,检测网络是否连通
  9. 转载:为啥Android手机总会越用越慢?
  10. 怎么制作纯html,教你一招纯HTML制作个人简历