精华内容
下载资源
问答
  • .h文件和.c文件

    千次阅读 2018-08-21 16:46:38
    H文件中一般是声明,包括:变量声明、宏定义、枚举声明、结构体声明、函数声明等。. H头文件是对该模块(.c文件)接口的声明,接口包括该模块提供给其他模块调用的外部函数以及外部全局变量。其他模块访问这些外部...

    (1).h头文件

    H文件中一般是声明,包括:变量声明、宏定义、枚举声明、结构体声明、函数声明等。.

    H头文件是对该模块(.c文件)接口的声明,接口包括该模块提供给其他模块调用的外部函数以及外部全局变量。其他模块访问这些外部定义的变量和函数都需要在.h文件中冠以extern关键字声明;模块(.c文件)内的函数和全局变量一般需要在.c文件开头冠以static关键字声明。

    所以说永远不要在.h文件中定义变量,但可以声明变量。

    如果其他模块想要调用该模块的变量和函数,直接包含该模块的头文件即可。

    例子1:(sqlite_interface.h头文件)

    #ifndef _SQLITE_INTERFACE_H_

    #define _SQLITE_INTERFACE_H_

    #include "include/sqlite3.h"

    #include "fs4412_mpu6050.h" //此文件是mpu6050的驱动程序文件

    #define SQLITE_OPEN "/mysqlite.db"

    struct data

    {

    int adc;

    union mpu6050_data env_all;

    };

    extern int create_table(void);

    extern int init_table_env(void);

    extern int set_env(int val, int no);

    extern void update_env(struct data env);

    #endif

    (2).c源文件

    上面说到所有的声明应该写到.h文件中,.c文件中应该写变量的定义,函数的实现;同时一般在.c文件内部使用的全局变量,会冠以static。

    为什么要这样做呢?不能把变量定义在.h文件中,函数实现在.h文件中。

    理由:

    [1]:如果在.h头文件中定义一个全局变量,并将此全局变量赋初值,那么多个.c文件引用此.h头文件时,在预处理阶段会进行相同变量名的拷贝,即:此全局变量会存在于多个.c源文件中,如果在main函数中,对这些.c源文件进行引用,在编译连接阶段会出现重定义的错误。

    例如:

    /tmp/ccvn1Qmc.o:(.data+0x0): multiple definition of `a'

    /tmp/ccPfYKZc.o:(.data+0x0): first defined here

    上面指出定义了多个变量‘a’,不知道哪个是第一个定义的变量。

    [2]:如果在.h头文件实现一个函数体,那么在多个.c文件中引用它,又同时编译多个.c文件,也会出现上面的问题,在连接阶段发现有多个相同的函数,进而报错。

    [3]当你需要将自己的源码封装成一个库文件时,让别人用你的代码,又不想公开源码,那么别人怎么使用你的库文件呢?我们可以提供含有函数声明和结构体的.h头文件,这样别人才知道怎么去调用你的函数和结构体。

    在说几个细节问题:

    [1]:C文件名的定义好与当前模块的意义有直接关联。

    [2]:C文件中的内容都是与当前模块相关的内容。

    [3]:将不同的代码写到不同的.c文件中,便于代码的管理

    例子2:(sqlite_interface.c源文件)

    #include <stdio.h>

    #include <errno.h>

    #include <fcntl.h>

    #include <unistd.h>

    #include <stdlib.h>

    #include <string.h>

    #include "sqlite_interface.h"

    static int callback_val[7];

    /*创建数据库表*/

    int create_table(void)

    {

    sqlite3* db;

    char sql[1024];

    int recode;

    char *err_msg;

    recode = sqlite3_open(SQLITE_OPEN, &db);

    if(recode != SQLITE_OK)

    {

    printf("Can't Open Database:%s\n", sqlite3_errmsg(db));

    sqlite3_close(db);

    return 1;

    }else

    {

    printf("Database Open OK!\n");

    }

    sprintf(sql,"create table env(adc int,gyro_x short,gyro_y short,gyro_z short,accel_x short,accel_y short,accel_z short);");

    recode = sqlite3_exec(db, sql, 0, 0, &err_msg);

    if(recode != SQLITE_OK)

    {

    if(strcmp(err_msg, "table env already exists"))

    {

    printf("Error:%s", err_msg);

    sqlite3_close(db);

    return 1;

    }

    else

    printf("table env already exist,so open it ok!\n");

    }

    else

    {

    init_table_env();

    printf("create env ok!\n");

    sqlite3_close(db);

    return 0;

    }

    return 0;

    }

    /*初始化环境表*/

    int init_table_env(void)

    {

    char sql[1024];

    sqlite3 *db;

    char *err_msg = 0;

    int recode;

    sprintf(sql, "insert into env values(0, 0, 0, 0, 0, 0, 0)");

    recode = sqlite3_open(SQLITE_OPEN, &db);

    if(recode != SQLITE_OK)

    {

    printf("Can't Open Database:%s\n", sqlite3_errmsg(db));

    sqlite3_close(db);

    return 1;

    }

    else

    {

    recode = sqlite3_exec(db, sql, 0, 0, &err_msg);

    if(recode != SQLITE_OK)

    {

    printf("Error:%s", err_msg);

    sqlite3_close(db);

    return 1;

    }

    else

    {

    printf("init env OK!\n");

    sqlite3_close(db);

    return 0;

    }

    }

    }

    /*设置某一个环境数据*/

    int set_env(int val, int no)

    {

    char sql[1024];

    sqlite3 *db;

    char *err_msg = 0;

    int recode;

    switch(no)

    {

    case 1:

    sprintf(sql, "update env set adc = '%d';", val);

    break;

    case 2:

    sprintf(sql, "update env set gyro_x = '%d';", val);

    break;

    case 3:

    sprintf(sql, "update env set gyro_y = '%d';", val);

    break;

    case 4:

    sprintf(sql, "update env set gyro_z = '%d';", val);

    break;

    case 5:

    sprintf(sql, "update env set accel_x = '%d';", val);

    break;

    case 6:

    sprintf(sql, "update env set accel_y = '%d';", val);

    break;

    case 7:

    sprintf(sql, "update env set accel_z = '%d';", val);

    break;

    }

    recode = sqlite3_open(SQLITE_OPEN, &db);

    if(recode != SQLITE_OK)

    {

    printf("Can't Open Database:%s\n", sqlite3_errmsg(db));

    sqlite3_close(db);

    return 1;

    }

    else

    {

    recode = sqlite3_exec(db, sql, 0, 0, &err_msg);

    if(recode != SQLITE_OK)

    {

    printf("Error:%s", err_msg);

    sqlite3_close(db);

    return 1;

    }

    else

    {

    printf("set env OK!\n");

    sqlite3_close(db);

    return 0;

    }

    }

    }

    /*更新env环境数据*/

    void update_env(struct data env)

    {

    set_env(env.adc, 1);

    set_env((short)env.env_all.gyro.x, 2);

    set_env((short)env.env_all.gyro.y, 3);

    set_env((short)env.env_all.gyro.z, 4);

    set_env((short)env.env_all.accel.x, 5);

    set_env((short)env.env_all.accel.y, 6);

    set_env((short)env.env_all.accel.z, 7);

    printf("update env OK!\n");

    }

    展开全文
  • Keil增加c文件和h文件

    千次阅读 2020-05-12 15:19:00
    .h文件同理。 导入文件 导入c文件 点击Manage Project Items(品字)-Project Items, Project Targets可以修改项目名称, Groups可增加项目下的文件夹(不必和实际工程的文件夹对应,但建议写成一样), Fi...

    新建文件

    新建文件有两种方式,
    一是点击左上角的新建文件,保存的时候用XXX.c命名即可;
    二是直接在需要的地方新建.c文件即可。
    .h文件同理。

    导入文件

    导入c文件

    点击Manage Project Items(品字)-Project Items,
    Project Targets可以修改项目名称,
    Groups可增加项目下的文件夹(不必和实际工程的文件夹对应,但建议写成一样),
    Files可增加c文件。

    导入h文件

    点击options for targets...(锤子)-C/C++-Include Paths
    点击右边的...增加h文件的文件夹即可,
    因此建议把所有头文件放到同一个文件夹下,这样就不用每次都添加了!

    展开全文
  • 关于Arduino创建工程,.cpp和.h文件创建方法以及多个.ino文件链接方法 .cpp文件只能是这个名字,不能是.c 可以直接创建多个.ino文件,不需要.cpp文件

    关于Arduino创建工程,.cpp和.h文件创建方法以及多个.ino文件链接方法

    1. .cpp文件只能是这个名字,不能是.c
    2. 可以直接创建多个.ino文件,不需要.cpp文件
    展开全文
  • CodeBlocks下创建.h .cpp文件

    千次阅读 多人点赞 2020-05-03 11:02:04
    ...New->Class ... 将新生成的class文件添加到刚建立的项目中,选择是 继续选"是" ...Person.h文件中添加相应字段及方法名 Person.cpp文件中实现Person.h中定义的方法 在main中调用 Person.h #...

    开始创建项目
    在这里插入图片描述

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/202005031035

    在这里插入图片描述
    点击next, 再次点击finish,就会的得到如下的项目目录文件
    在这里插入图片描述
    点击右上角File->New->Class
    在这里插入图片描述
    输入名称,点击create
    在这里插入图片描述

    将新生成的class文件添加到刚建立的项目中,选择是
    在这里插入图片描述
    继续选"是"
    在这里插入图片描述
    项目目录如下
    在这里插入图片描述
    Person.h文件中添加相应字段及方法名
    在这里插入图片描述Person.cpp文件中实现Person.h中定义的方法
    在这里插入图片描述
    在main中调用
    在这里插入图片描述
    运行结果
    在这里插入图片描述
    Person.h

    #ifndef PERSON_H
    #define PERSON_H
    #include <iostream>
    using namespace std;
    
    class Person
    {
        public:
            Person();
            Person(string personName, int personAge, string personGender, float personWeight);
    
            string getPersonName();
            int getPersonAge();
            string getPersonGender();
            float getPersonWeight();
    
            void setPersonName(string personName);
            void setPersonAge(int personAge);
            void setPersonGender(string personGender);
            void setPersonWeighr(float personWeight);
    
            void printPerson();
    
            virtual ~Person();
    
        protected:
    
        private:
            string personName;
            int personAge;
            string personGender;
            float personWeight;
    };
    
    #endif // PERSON_H
    

    Person.cpp

    #include "Person.h"
    
    Person::Person()
    {
        cout << "generate person" << endl;
    }
    
    Person::Person(string personName, int personAge, string personGender, float personWeight)
    {
        this -> personName = personName;
        this -> personAge = personAge;
        this -> personGender = personGender;
        this -> personWeight = personWeight;
        cout << "generate person " << this -> personName << endl;
    }
    
    string Person::getPersonName()
    {
        return this -> personName;
    }
    int Person::getPersonAge()
    {
        return this -> personAge;
    }
    string Person::getPersonGender()
    {
        return this -> personGender;
    }
    float Person::getPersonWeight()
    {
        return this -> personWeight;
    }
    
    void Person::setPersonName(string personName)
    {
        this -> personName = personName;
    }
    void Person::setPersonAge(int personAge)
    {
        this -> personAge = personAge;
    }
    void Person::setPersonGender(string personGender)
    {
        this -> personGender = personGender;
    }
    void Person::setPersonWeighr(float personWeight)
    {
        this -> personWeight = personWeight;
    }
    
    
    void Person::printPerson()
    {
        cout << this -> personName << endl;
        cout << this -> personAge << endl;
        cout << this -> personGender << endl;
        cout << this -> personWeight << endl;
    
    }
    Person::~Person()
    {
        cout << "destroy person" << endl;
    }
    
    

    main.cpp

    #include <iostream>
    
    #include "Person.h"
    
    using namespace std;
    
    int main()
    {
        Person person;
        
        person.setPersonName("赵一剑");
        person.setPersonAge(22);
        person.setPersonGender("female");
        person.setPersonWeighr(50.0f);
        
        person.printPerson();
    
        return 0;
    }
    
    
    
    
    
    
    
    展开全文
  • 在所工程的文件夹下的HARDWARE子文件夹下创建一个所要添加文件名称,例如要添加led.c和led.h文件,可以先在HARDWARE文件目录下创建一个命名为LED的子文件夹。 2、第二步 在刚刚新建的LED文件夹下添加c文件和h文件...
  • CLion(编辑工具) new 一个 c++ class 文件(Test)会生成两个文件(Test.h and Test.cpp) .h 头文件 .cpp 源文件 头文件 Test.h 写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但...
  • 用qt designer或者qt creator设计好界面之后,如何生成ui_XXX.h文件呢? 首先需要清除的是:ui文件只是一个xml文件,编译器是不认识的,所以qt做了一个uic.exe的工具,会将ui文件(xml)默认编译成ui_xxx.h, 这样...
  • C++——如何理解.h文件和.cpp文件

    千次阅读 2019-01-15 10:49:11
    建立一个以类为名字的XX.h文件,声明类,再建立一个相同名字的XX.cpp文件(要#include “XX.h”),实现类中的函数, 在有main 函数的.cpp里声明函数,一个与函数名一样的.cpp文件,实现该函数;并且要 #include ...
  • CodeBlocks一个项目创建多个.c.h文件

    千次阅读 2019-12-09 15:53:43
    文章目录效果图选择>新建FILE创建.c/.h注意路径,成功创建 效果图 选择>新建FILE 创建.c/.h 注意路径,成功创建
  • c语言中的自己写的.h文件如何调用注意事项 需要建立一个项目project,并把相关的.h .c .cpp文件在这个项目下面。 需要注意引用时不同,例如 #include<stdio.h> 自己写的.h文件引用就是 #include"hello.h" ...
  • 关于config_site.h文件

    千次阅读 2014-01-07 19:13:48
    编译前的准备创建config_siteh文件config...创建config_site.h文件config_site.h文件的作用创建config_site.h文件时的注意点 创建config_site.h文件 在编译源代码之前,必须先创建pjlib/include/pj/config_site.h文件
  • xcode 新建文件没有 h 文件,是我们没操作对
  • 2018-04-04 创建人:Ruo_Xiao 开发环境:Qt 5.2.1 邮箱:xclsoftware@163... 将ui文件copy到uic.exe同一目录下(qt的安装目录中bin下)。 打开cmd,输入上述目录的路径。 ...上述两条指令分别生成了h文件和cpp文件。...
  • Linux下C编程入门( h文件, c文件,以及多文件调用的方式)
  • Xcode7里创建hpp头文件重新改为.h文件的方法
  • 问题如下所示:创建untitled6工程时只有untitled6.pro,没有Headers和Sources文件问题原因:新建工程时没有选择合适的构建套件,在windoWs下常见的有MSVC2013和MinGS。可以通过如下操作查看安装QT时系统添加的是哪种...
  • c++的.h文件如何写

    万次阅读 2018-04-21 13:25:21
    这周做实验碰到这个问题,想写下来实例格式为:#ifdefine 名字#define 名字主要代码#endif特别...还有你的.h文件中所用到的库都要包括进去.h文件.cpp文件没有什么关系.cpp文件中 #include &lt;.h文件名&gt;...
  • 1.5.Qt.ui文件是怎么生成相应的.h文件

    千次阅读 2017-10-10 11:25:25
    探究下.ui文件是怎么生成相应的.h文件的。.ui文件在编译文件时通过uic -o ui_***.h ***.ui 命令自动生成ui头文件。
  • C++中为什么要有.h文件和.cpp文件

    千次阅读 2016-02-14 11:34:03
    1,.h文件是不会被编译器编译的,而每个.cpp文件都会被编译,生成一个.obj文件。 2,这两个文件的名称不一定非要一样,只是为了方便阅读而已。在编译时,会根据#include去查找对应的.h文件 继续整理中.......
  • Qt中从.ui文件生成.h文件

    千次阅读 2010-03-01 23:28:00
    // 此main函数的作用是将Qt designer设计的好的// 界面的ui文件生成.h文件#include #include // 文件格式名为 ui_***.h 其中***为ui文件的名字部分// 例如 a.ui 的头文件为 ui_a.h#include "ui_dictationtexteditor....
  • vs2019无法打开 stdafx.h文件问题

    千次阅读 2020-07-20 21:24:18
    练习标签控件(Tab Control)时,通过添加文件的方式添加了TabSheet.cpp 和 TabSheet.h。 编译时一直报错:在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加 pch.h。 查了方法:右击报错的文件 -> ...
  • ccs中h文件如何加入

    万次阅读 2013-02-01 17:12:43
    include search path中将include文件夹路径写入,例如 上图中 存放的h文件的路径为 D:\MyTemp\MySelfProgram\include .这样就可以了。 在加载完的项目中,编译。这样*.h文件就自动加载到include文件中。 ...
  • h264和pcm文件打包成mp4文件

    千次阅读 2019-01-28 21:34:15
    h264和pcm文件打包成mp4文件 测试命令为Debug目录下执行:conver_mp4.exe 1280 720 16000 enc.h264 000.pcm out.mp4; conver_mp4.exe 视频宽 视频高 音频采样率 h264文件 pcm文件 输出mp4文件 欢迎使用Markdown编辑...
  • c语言中的.c文件和.h文件

    千次阅读 2018-11-29 09:48:18
    记录下一点点自己对两个文件的理解   函数声明可以有多分,但函数定义只能有一份。所以一般不在头文件里面定义函数,因为同一个程序的多个代码文件可能都会包含这个头文件。 但c++中的inline函数是个例外,得...
  • JNI.h文件浅析

    千次阅读 2013-04-02 13:45:13
    <!-- h2 {color:#E8A064; font-size:2em; padding:0px 0 10px 0px; border-bottom:2px solid #8CD5FF} p {margin-left:80px} table ...JNI.h文件浅析 原创作品,允许转载,转载时请
  • 我安装的是Visual Studio2015,编写一个CPP程序的过程通常是创建项目之后在源文件中添加新的.CPP文件,在头文件中添加.h文件。但是我发现源文件中也可以添加.cpp,源文件中也可以添加.h,如图所示。请问有什么区别吗...
  • Keil uVision5 在main.c文件无法包函.h文件,请问是为什么? ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200718142840247.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_...
  • vs中stdafx.h文件说明

    千次阅读 2018-06-15 17:08:59
    转自:https://blog.csdn.net/u012999985/article/details/50822029使用过Visual Studio,VC++的朋友对stdafx.h这个文件一定非常熟悉。我们新建工程的时候他就自动出现了,并且在每个.cpp文件的最前面都有一个#...
  • C++中.h文件与.cpp文件中该写什么?

    千次阅读 2016-07-29 20:01:57
    C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中。它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能。什么东西又可以放在cpp文件中。如果你忘记了或是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,071,068
精华内容 428,427
关键字:

如何创建h文件