头文件的编写和引用

      我用的是 Dev-c++  编写头文件

 

 

首先写头文件里面的函数,

 

 

 

然后保存,记得后缀写  .h   就行

 

例:(顺序表的头文件)

 

#define MAXSize 50
#define OVERFLOW -2
#define ElemType int
using namespace std;
typedef struct List{
ElemType *elem;
int length;
}SqList;
void InitList(SqList &L)
{ //构造一个空的顺序表
L.elem=new ElemType[MAXSize];
if (!L.elem)
exit(OVERFLOW);
L.length=0;
}
void ClearList(SqList &L)
{ //清空线性表,不销毁
L.length=0;
}
int ListLength (SqList L)
{ //求线性表长度
return (L.length);
}
bool ListInsert (SqList &L, int i , ElemType e)
{ //在线性表L中第i个数据元素之前插入新数据元素e
int j;
if (i<1||i>L.length+1)
return false;
if (L.length>=MAXSize)
return false;
for (j=L.length;j>=i;--j)
L.elem[j]=L.elem[j-1];
L.elem[i-1]=e;
++L.length;
return true;
}
ElemType GetElem(SqList L, int i)
{ //在线性表L中求序号为i的元素,该元素作为函数返回值
if (i<1||i>L.length){
printf("i不在[1..n]范围内");
exit(OVERFLOW);
}
return (L.elem[i-1]);
}
#define MAXSize 50
#define OVERFLOW -2
#define ElemType int
using namespace std;
typedef struct List{
ElemType *elem;
int length;
}SqList;
void InitList(SqList &L)
{ //构造一个空的顺序表
L.elem=new ElemType[MAXSize];
if (!L.elem)
exit(OVERFLOW);
L.length=0;
}
void ClearList(SqList &L)
{ //清空线性表,不销毁
L.length=0;
}
int ListLength (SqList L)
{ //求线性表长度
return (L.length);
}
bool ListInsert (SqList &L, int i , ElemType e)
{ //在线性表L中第i个数据元素之前插入新数据元素e
int j;
if (i<1||i>L.length+1)
return false;
if (L.length>=MAXSize)
return false;
for (j=L.length;j>=i;--j)
L.elem[j]=L.elem[j-1];
L.elem[i-1]=e;
++L.length;
return true;
}
ElemType GetElem(SqList L, int i)
{ //在线性表L中求序号为i的元素,该元素作为函数返回值
if (i<1||i>L.length){
printf("i不在[1..n]范围内");
exit(OVERFLOW);
}
return (L.elem[i-1]);
}

 

 

然后保存

 

 

 

头文件就写好了,然后引用 

方法1:

  #include"E:\List.h"             //   #include"  头文件存放路径+头文件名"

方法2:

  将编写的头文件 和  正准备调用          该头文件      的项目文件放在同一个文件夹里面

 

转载于:https://www.cnblogs.com/q1204675546/p/9891181.html

### 正确引用 Linux 内核头文件的方法 在 Linux 驱动开发过程中,正确引用内核头文件是非常重要的一步。以下是关于如何正确引用内核头文件的具体方法以及一个 LED 控制驱动的示例。 #### 1. 使用标准路径 Linux 内核提供了丰富的头文件来支持驱动程序开发。这些头文件通常位于 `/usr/src/linux-headers-<version>/include` 或者通过交叉编译工具链指定的路径中。可以通过 `#include <linux/*.h>` 的方式引用所需的头文件[^3]。 例如,在驱动程序中需要操作 GPIO 来控制 LED,则可以引用如下头文件: ```c #include <linux/module.h> // 所有模块都需要此头文件 #include <linux/kernel.h> // 提供 KERN_INFO 宏等 #include <linux/init.h> // 初始化函数声明所需 #include <linux/gpio.h> // GPIO 操作接口 #include <linux/fs.h> // 文件系统相关定义 #include <linux/uaccess.h> // 用户空间访问权限 ``` 以上代码片段展示了常见的内核头文件引用方式[^1]。 --- #### 2. Makefile 中配置头文件路径 Makefile 是构建内核模块的关键部分。它负责设置编译选项并链接必要的头文件库文件。以下是一个简单的 Makefile 示例,其中指定了内核源码路径以便正确找到头文件[^2]: ```makefile obj-m += led_driver.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: $(MAKE) -C $(KDIR) M=$(PWD) clean ``` 在此 Makefile 中,变量 `KDIR` 被用来指向当前运行系统的内核源码目录,从而确保能够加载正确的头文件符号表[^4]。 --- #### 3. 实际案例:LED 开关驱动 下面展示的是一个基于上述头文件引用的简单 LED 控制驱动程序实例。该驱动允许用户通过字符设备节点打开或关闭连接到特定 GPIO 引脚上的 LED。 ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/gpio.h> #include <linux/fs.h> #include <linux/uaccess.h> #define DEVICE_NAME "led" #define CLASS_NAME "gpio" static int majorNumber; static struct class* gpioClass = NULL; static struct device* gpioDevice = NULL; // 假设使用的 GPIO 编号为 17 (BCM2835) #define LED_GPIO_PIN 17 static ssize_t dev_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){ char command; if(copy_from_user(&command,buf,sizeof(command))) { return -EFAULT; } if(command == '0') { gpio_set_value(LED_GPIO_PIN, 0); printk(KERN_INFO "LED off\n"); } else if(command == '1'){ gpio_set_value(LED_GPIO_PIN, 1); printk(KERN_INFO "LED on\n"); } return sizeof(command); } static int dev_open(struct inode *, struct file *); static int dev_release(struct inode *, struct file *); static struct file_operations fops = { .write = dev_write, .open = dev_open, .release = dev_release, }; static int __init led_init(void){ int result = 0; majorNumber = register_chrdev(0, DEVICE_NAME, &fops); if(majorNumber < 0){ printk(KERN_ALERT "Registering char device failed with %d\n",majorNumber); return majorNumber; } gpioClass = class_create(THIS_MODULE,CLASS_NAME); gpioDevice = device_create(gpioClass,NULL,MKDEV(majorNumber,0),NULL,DEVICE_NAME); if(IS_ERR(gpioDevice)){ result = PTR_ERR(gpioDevice); goto fail_device_register; } if(gpio_request(LED_GPIO_PIN,"sysfs") != 0){ result = -ENODEV; goto fail_gpio_request; } gpio_direction_output(LED_GPIO_PIN,0); gpio_export(LED_GPIO_PIN,false); printk(KERN_INFO "GPIO test driver installed.\n"); return 0; fail_gpio_request: device_destroy(gpioClass,MKDEV(majorNumber,0)); fail_device_register: unregister_chrdev(majorNumber,DEVICE_NAME); return result; } static void __exit led_exit(void){ gpio_unexport(LED_GPIO_PIN); gpio_free(LED_GPIO_PIN); device_destroy(gpioClass,MKDEV(majorNumber,0)); class_unregister(gpioClass); class_destroy(gpioClass); unregister_chrdev(majorNumber,DEVICE_NAME); printk(KERN_INFO "GPIO test driver removed.\n"); } module_init(led_init); module_exit(led_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Example Author"); MODULE_DESCRIPTION("A simple LED control driver."); MODULE_VERSION("0.1"); ``` 在这个例子中,我们使用了 `<linux/gpio.h>` 其他核心头文件来完成对 GPIO 的初始化、方向设定以及导出等功能调用。 --- #### 总结 为了在 Linux 驱动程序中正确引用内核头文件,需注意以下几点: - 明确哪些功能需要用到对应的头文件; - 在 Makefile 中合理配置内核源码路径; - 结合实际需求选择合适的 API 接口进行编程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值