extent static const

本文详细解释了C++中extern和static关键字的作用及其对变量和函数链接属性的影响,并探讨了为何头文件通常只包含声明而不包含定义的原因。

  extern:这就是告诉编译器,这个变量或函数在别的编译单元里定义了,也就是要把这个符号放到未解决符号表里面去(外部链接)。

     static:如果该关键字位于全局函数或者变量的声明前面,表明该编译单元不导出这个函数或变量,因些这个符号不能在别的编译单元中使用(内部链接)。如果是static局部变量,则该变量的存储方式和全局变量一样,但是仍然不导出符号。 

     默认链接属性:对于函数和变量,默认链接是外部链接,对于const变量,默认内部链接。

     外部链接的利弊:外部链接的符号在整个程序范围内都是可以使用的,这就要求其他编译单元不能导出相同的符号(不然就会报

duplicated external symbols)。

     内部链接的利弊:内部链接的符号不能在别的编译单元中使用。但不同的编译单元可以拥有同样的名称的符号。

     为什么头文件里一般只可以有声明不能有定义:头文件可以被多个编译单元包含,如果头文件里面有定义的话,那么每个包含这头文件的编译单元都会对同一个符号进行定义,如果该符号为外部链接,则会导致duplicated external symbols链接错误。 

     为什么公共使用的内联函数要定义于头文件里:因为编译时编译单元之间互不知道,如果内联被定义于.cpp文件中,编译其他使用该函数的编译单元的时候没有办法找到函数的定义,因些无法对函数进行展开。所以如果内联函数定义于.cpp里,那么就只有这个.cpp文件能使用它。


对于函数和变量,默认的是外部链接,但是如果是const 变量,则是内部链接。const和static就是把变量变为内部变量,外部不可以用。但是extent const变量,外部可以用,但是不能修改。

例如:

在t.cpp的定义如下:

int at = 7;

const int c = 9;

extern const int bt = 3;


在main.cpp

extern int at;//全局变量都是外部变量,其他编译单元只要加extern就可以引用。所以extern的作用就是,这个变量不是在本编译单元定义的
extern void f();//和全局变量一样
int bt = 8;//


int main() {

cout<<at<<endl;
   f();
 
   cout<<d<<endl;
    return 0; 

}



#pragma once #include <opencv2/opencv.hpp> #include <vector> #include <Eigen/Eigen> #include <pcl/point_cloud.h> #include <pcl/point_types.h> #include <vtkTransform.h> #include <vtkBoxRepresentation.h> // 用于提取包围盒尺寸信息(若需要) // 投影结果结构体 struct ProjResult { cv::Mat img; // 投影图像 std::vector<cv::Point> obb_corners; // OBB像素角点 cv::Point obb_center; // OBB中心像素坐标 }; // 面类型枚举(仅保留X+、Y+、Z+面) enum class FaceType { X_POS, // X+面(垂直于局部X轴正方向) Y_POS, // Y+面(垂直于局部Y轴正方向) Z_POS // Z+面(垂直于局部Z轴正方向) }; // OBB数据结构体 struct ObbData { float pos_x, pos_y, pos_z; // 中心点坐标 float rot_x, rot_y, rot_z; // 旋转角(弧度) float scale_x, scale_y, scale_z; // 尺寸 std::string obj_type; // 对象类型 }; // 内存级接口:新增use_all_points参数控制投影范围 // use_all_points = true: 投影全部点云 // use_all_points = false: 仅投影OBB内点云(默认行为) int get_proj_results( const pcl::PointCloud<pcl::PointXYZ>::ConstPtr& cloud, const std::vector<ObbData>& obb_data, ProjResult* results, bool use_all_points = false // 新增参数:控制投影范围 ); // 文件级接口:新增use_all_points参数 int gen_proj_images( const char* pcd_path, const char* json_path, bool use_all_points = false // 新增参数:控制投影范围 ); // 释放投影结果内存 void free_proj_results( ProjResult* results ); // 内部辅助类函数 namespace Internal { class OrientedBBox { public: Eigen::Vector3f center; Eigen::Vector3f extent; Eigen::Affine3f transform; OrientedBBox() : center(Eigen::Vector3f::Zero()), extent(Eigen::Vector3f::Zero()), transform(Eigen::Affine3f::Identity()) {} OrientedBBox(Eigen::Vector3f center, Eigen::Vector3f dimensions, Eigen::Affine3f transform_to_local) { this->center = center; this->extent = dimensions; transform_to_local.translation() = this->center; this->transform = transform_to_local.inverse(); } // 从vtkTransform构造 // 从vtkTransform构造(直接嵌入转换逻辑,不依赖外部函数) OrientedBBox(vtkTransform* vtkTrans) { if (!vtkTrans) { center = Eigen::Vector3f::Zero(); extent = Eigen::Vector3f::Zero(); transform = Eigen::Affine3f::Identity(); return; } // 1. 从vtkTransform提取4x4矩阵,转换为Eigen::Affine3f vtkMatrix4x4* vtkMat = vtkTrans->GetMatrix(); // 获取VTK变换矩阵 Eigen::Matrix4f eigenMat; // 初始化Eigen矩阵 // 逐元素复制(VTKEigen均为列优先存储) for (int row = 0; row < 4; ++row) { for (int col = 0; col < 4; ++col) { eigenMat(row, col) = static_cast<float>(vtkMat->GetElement(row, col)); } } transform = Eigen::Affine3f(eigenMat); // 转换为仿射变换 // 2. 提取中心(变换的平移分量) center = transform.translation(); // 3. 提取缩放作为extent double scale[3]; vtkTrans->GetScale(scale); // 获取VTK变换的各轴缩放系数 extent = Eigen::Vector3f( static_cast<float>(scale[0]), static_cast<float>(scale[1]), static_cast<float>(scale[2]) ); } // 新增:将OrientedBBox的变换转换为vtkTransform vtkTransform* to_vtk_tansform() const { // 1. 从Eigen::Affine3f提取4x4矩阵 const Eigen::Matrix4f& eigenMat = transform.matrix(); vtkMatrix4x4* vtkMat = vtkMatrix4x4::New(); // 创建VTK矩阵 // 逐元素复制 for (int row = 0; row < 4; ++row) { for (int col = 0; col < 4; ++col) { vtkMat->SetElement(row, col, eigenMat(row, col)); } } // 2. 关联到vtkTransform vtkTransform* vtkTrans = vtkTransform::New(); vtkTrans->SetMatrix(vtkMat); // VTK会内部复制矩阵数据 // 释放中间矩阵 // vtkMat->Delete(); return vtkTrans; } std::vector<int> get_points_in_box(const pcl::PointCloud<pcl::PointXYZ>::ConstPtr& cloud) const; std::vector<Eigen::Vector3f> get_corners() const; Eigen::Matrix3f get_axes() const; Eigen::Affine3f get_global_to_local() const; Eigen::Affine3f get_local_to_global() const; bool get_face_info(FaceType face, std::vector<Eigen::Vector3f>& out_vertices, Eigen::Vector3f& out_center) const; bool get_face_local_axes(FaceType face, Eigen::Vector3f& out_u, Eigen::Vector3f& out_v, Eigen::Vector3f& out_n) const; OrientedBBox rotate_around_face_normal(FaceType face, float theta_deg) const; }; OrientedBBox parse_obb(const std::vector<ObbData>& obb_data); cv::Mat gen_proj_internal( const pcl::PointCloud<pcl::PointXYZ>::ConstPtr& local_cloud, const OrientedBBox& obb, const Eigen::Vector3f& cam_pos, std::vector<cv::Point>& out_corners, cv::Point& out_center, float cam_rot_deg = 0.0f ); } PointCloudProjection.h 已经有了 给出mainwindow.h .cpp 这个文件是小写的
10-26
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现扩展应用。; 适合人群:具备电力系统基础知识Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值