编写头文件时需要注意的事

头文件管理
      最近在编写头文件时碰到了一些大多数初学者碰到的一些问题,下面对于在编写头文件时需要注意的一些问题进行一个小的总结。

     1. 在编译自己的头文件的时候,注意包含头文件的尖括号和双引号的使用。可能很多初学者习惯于编写自己的头文件时比较习惯于使用尖括号来包含自己的头文件,但往往会出现“无法打开xx.h文件”,可能会有人奇怪,自己编写的头文件明明包含在工程的目录下,问什么会显示这类错误呢?以下是《C++primer plus(第六版)》给出的解释:

      “如果文件名包含在尖括号里面时,则C++编译器将在存储标准头文件的主机系统的文件系统中查找;但是如果文件包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录(或者是其他目录,取决于编译器)。如果没有在哪里找到头文件,则将在标准位置查找。因此在包含自己的头文件时,应使用引号而不是尖括号;”

   2.头文件包含问题在同一个文件中只能将同一个头文件包含一次。但是很可能在不知情的情况下将头文件包含多次。例如,可能使用包含另一个头文件的头文件。有一种标准的C/C++技术可以避免多次包含同一个头文件。它是基于预处理编译指令#ifndef(即if not defined)的。下面的代码意味着仅当以前没有使用预处理器编译指令#define定义名称COORDIN_H_时,才处理#ifndef和#endif之间的语句:

#ifndef COORDIN_H_
…
#endif
通常在生成自己的头文件时是这样使用的

#ifndef COORDIN_H_
#define COORDIN_H_
//place include file contents here
#endif

      采用这种方式编写头文件的目的在于可以避免在一个文件中定义同一个结构多次,而导致编译错误

下面给一个相关的小例子吧,这样理解起来更容易一点。程序的功能是用来将直角坐标系坐标值转换为极坐标系坐标值。

1.头文件coordin.h

#ifndef COORDIN_H_
#define COORDIN_H_
struct polar
{
	double distance;
	double angle;
};
struct rect
{
	double x;
	double y;
};
polar rect_to_polar(rect);
void show_polar(polar);
#endif

2.源代码文件

coordin.cpp

#include "coordin.h"
#include<cmath>
#include <iostream>
polar rect_to_polar(rect xypos)
{
	polar answer;
	answer.distance = sqrt(xypos.x*xypos.x + xypos.y*xypos.y);
	answer.angle = atan2(xypos.y, xypos.x);
	return answer;
}
void show_polar(polar rplace)
{
	using namespace std;
	const double Rad_to_deg = 57.3;
	cout << "distance=" << rplace.distance;
	cout << ",angle=" << rplace.angle*Rad_to_deg;
	cout << " degree\n";

}
main.cpp

#include "coordin.h"
#include<iostream>
int main()
{
	using namespace std;
	rect rplace;
	polar pplace;
	cout << "enter two number x and y:";
	while (cin>>rplace.x>>rplace.y)
	{
		pplace = rect_to_polar(rplace);
		show_polar(pplace);
		cout << "next two number (q to exit):";
	}
	cout << "bye!\n";
	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在CLion中编写头文件的步骤如下: 1. 打开CLion并创建一个新的C/C++项目。 2. 在项目的根目录下创建一个名为`include`的文件夹,用于存放头文件。 3. 在`include`文件夹中创建一个名为`myheader.h`的头文件,可以根据需要定义所需的函数、结构体或宏等。 4. 在需要使用该头文件的源文件中,使用`#include`指令引入头文件。例如,如果源文件名为`main.c`,则可以在该文件的开头添加`#include "myheader.h"`。 5. 在CLion的CMakeLists.txt文件中,使用`include_directories`指令指定头文件目录。例如,如果头文件存放在`include`文件夹中,则可以添加以下指令:`include_directories(include)`。 6. 编写头文件和源文件后,可以进行编译和运行。 需要注意的是,根据引用\[1\]的描述,如果你使用的是一个模板文件,那么在每次使用CubeMX生成代码,CMakeLists.txt文件会被覆盖,用户的代码将不会被保存。因此,你可能需要修改模板文件CMakeLists_template.txt来包含你的头文件和库文件的相关指令。具体的修改方式可以根据你的项目需求和模板文件的内容进行调整。 引用\[1\]: 对于一个项目,不可避免地会用到第三方库或者自己创建的.c/.h文件,也就是需要修改CmakeList文件。但这里的CMakelist开头写明了#此文件从模板自动生成! 请勿更改!,其原因为在每一次使用CubeMX生成代码此文件会被覆盖,用户的代码将不会被保存。所以需要修改模板文件CMakeLists_template.txt。 引用\[2\]: PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF); return ch; } 然后即可使用`printf`函数。且此段代码在Keil和Clion中均可正常编译运行。 引用\[3\]: 当编译一个需要使用第三方库的软件,我们需要知道去哪寻找头文件,则CMakeLists.txt需要指定头文件目录和库文件: include_directories(/usr/include/curl) target_link_libraries(myprogram path/curl.so)。 #### 引用[.reference_title] - *1* *2* [使用Clion开发STM32](https://blog.csdn.net/oXiaoLingTong/article/details/125313393)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [cmake find_package](https://blog.csdn.net/qq_29935433/article/details/123554805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值