头文件包含在 MPLAB X 中不起作用 IDE

Header file inclusion doesn't work in MPLAB X IDE

screenshot of my code and error data

这是我的 main.c 文件

#include "services_initialisations_prototype.h"
#include "services_functions_prototype.h"


void main(void)
    {
    initSfr();
    while(1){
        updateMatrix(404, 1);
        }
    return;
    }

这是我的services_initialisations_prototype.h


#ifndef XC_HEADER_TEMPLATE_H
#define XC_HEADER_TEMPLATE_H

#include <xc.h> // include processor files - each processor file is guarded.  
#include <stdint.h>

//these are my function declarations
extern void initInterrupt();
extern void initIoc();
extern void initAdc();
extern void initTimer2();
extern void initSfr();


#ifdef  __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef  __cplusplus
}
#endif /* __cplusplus */

#endif  /* XC_HEADER_TEMPLATE_H */

这是我的services_functions_prototype.h

#ifndef XC_HEADER_TEMPLATE_H
#define XC_HEADER_TEMPLATE_H

#include <xc.h> // include processor files - each processor file is guarded.  
#include <stdint.h>

//these are my function declarations
extern void updateMatrix(int, int);

#ifdef  __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef  __cplusplus
}
#endif /* __cplusplus */

#endif  /* XC_HEADER_TEMPLATE_H */

当我尝试在 MPLAB X IDE 4.05 版中包含两个头文件时,它似乎无法识别第二个头文件。我试过调换顺序,但仍然没有检测到第二个。

services_initialisation_prototype.h 包含 SFR 的初始化,services_functions_prototype.h 包含其他函数的原型。这些功能是相互独立的。

当我编译时,显示

函数 updateMatrix() 被声明为隐式 int。 变量 _updateMatrix() 的声明冲突

这说明头文件services_functions_prototype没有被识别。

所附的屏幕截图以灰色显示services_functions_prototype.h中的代码,似乎部分代码未执行。

当我将整个声明从头文件复制到我的主文件时,它工作得很好。

您在两个文件中使用了相同的包含防护。因为一个文件包含在另一个文件之前,所以它定义了 XC_HEADER_TEMPLATE_H,这使得 #ifndef 在第二个文件中失败。将它们更改为独特的东西。 Wiki include guard.

请记住,带有两个前导下划线的标识符或带有前导下划线和一个大写字母的标识符是 C 标准保留的。好的在线文档在 gcc reserved names.

使用大写的文件名,例如 SERVICES_FUNCTIONS_PROTOTYPE_H_SERVICES_INITIALIZATIONS_PROTOTYPE_H_

备注:

  • 函数声明中的空参数列表声明了一个采用 未知 参数数量和类型的函数。首选在函数参数列表中显式写入 void 以定义不带参数的函数,以启用编译器静态检查。 IE。做 void initInterrupt(void);cppreference function declaration
  • 在文件范围内声明的标识符隐式带有外部链接。 IE。 extern只是多余的,只是 void initSfr(void); 而不是 extern void initSfr(); cppreference storage-class
  • extern "C" { 部分在您的 header 中毫无意义 - 它里面没有任何内容。通常将 extern "C" { 放在 header 文件的顶部 上以包含其中的所有内容。如果您的 headers 将被 C++ 编译器使用,函数名称将被破坏并且无法正确解析。我相信我会建议只删除 extern "C" { 部分。