This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:尝试在库中创建私有和公有 h 文件失败--可能是结构问题?

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/957710/msp430fr2355-attempt-at-creating-private-and-public-h-files-in-a-library-failing------possibly-over-structures

器件型号:MSP430FR2355

我的 libc prj 在编译时不会发出四个函数调用的错误标志。  这四个调用每个调用引用一个结构参数。  我在源代码中提供了第一个具有代表性的函数。  每个具有结构的函数都会给出错误和相应的警告...当所有这些都在一个头文件中时,所有这些都可以正常工作。  有人能告诉我、我需要做些什么来允许在公共标头中提供包含结构的函数声明、同时在私有中隐藏不需要的结构?  我发现可以提供文档、向用户显示结构参数。

错误:

#148声明与"char radioBusyPinConfig (struct busyPin *)"不兼容(在"D:\customers\Firmware\LPRS_lib\Header\lprs_public.h"的第43行声明)
#148声明与"uint * config_timer (struct confTimer *)"不兼容(在"D:\customers\Firmware\LPRS_lib\Header\lprs_public.h"的第40行声明)
#148声明与"uint * run_timer (struct confTimer *、const char *)"不兼容(在"D:\customers\Firmware\LPRS_lib\Header\lprs_public.h"的第41行声明)
#148声明与"uint config_comm(struct confComm *)"不兼容(在"D:\customers\Firmware\LPRS_lib\Header\lprs_public.h"的第42行声明)

警告:

函数外部不显示#233-D 声明
函数外部不显示#233-D 声明
函数外部不显示#233-D 声明
函数外部不显示#233-D 声明

libc 源文件:

#include 
#include 
#include 
#include 
#include 

//#include "lprs_public.h"
#include "lprs_private.h"

//函数

char radioBusyPinConfig (struct busyPin *s_P)
{
char v、k;
V = 1 <<(s_P->引脚);

交换机(s_P->port)
{
案例1:
P1DIR &=~v;
k = P1IN & v;
中断;
案例2:
P2DIR &=~v;
k = P2IN & v;
中断;
案例3:
P3DIR &=~v;
k = P3IN & v;
中断;
案例4:
P4DIR &=~v;
k = P4IN & v;
中断;
情况5:
P5DIR &=~v;
k = P5IN & v;
中断;
案例6:
P6DIR &=~v;
k = P6IN & v;
中断;
默认值:
中断;
}
返回 k;
}
。。 

私有头文件:

#include "lprs_public.h"

struct confTimer
{
char tmr[3];
字符 CCR[2];
char cnt_length[3];
UINT countValue;
};

struct confComm
{
字符端口[3];
char clkFrq[9];
char 波特率[6];
};

struct busyPin
{
int 端口;
INT 引脚;
};

公共头文件:

typedef unsigned int uint;
typedef unsigned char uchar;

uchar * radioMachine (char * pcd);
uint * config_timer (conft Timer * CT
、const char * dir);
uint config_commt (struct confComm * CC);
char BusyPinConfig (struct pin *);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在函数原型中使用结构名称之前、编译器需要知道该结构名称。 通常我会看到"公共"包括"私人"、但我不知道你是在哪里。

    如果这会导致循环、您只需在引用结构体的内容之前声明完整结构体、即可使用"struct busyPin;"来声明"不完整"结构体。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再次感谢您!  "struct busyPin"……效果很好。

    我有一个计划,但对这种公共/私人的概念是不熟悉的……我可能会重新思考并采纳你的建议,公众包括私人……

    在两个方向上肯定会有循环.

    让我问这个

    如果我使用公共和私有报头编译和创建一个 libc。  我是否只需为客户提供公共和 libc 对象文件、以便他们将其放入应用程序代码中、或者我是否还必须提供私有头文件并让他们"非常清楚"进行修改?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果向"恶意"调用方提供的结构类型仅不完整、则调用方可以存储指向它们的指针、但无法引用内容、或者(可能更重要)无法定义其实例、因为大小未知。 如果您的库是唯一创建实例的东西、这些"不透明"类型可能还不错。 这也意味着(我很确定)他们在调试时无法查看结构、这可能是您想要的、也可能不是。

    如果您的受众只是敌意的、则有一个不同的限制来自您的库是预编译的、如果它们与结构混乱、则它们的程序将不起作用。 这里的一个简单示例是 Unix 文件结构、它就在 stdio.h 中、但如果您尝试更改它、您要使用的库函数将会中断。

    我可能应该将"最佳实践"推迟到其他人;在我的项目中、数据隐藏主要是通过同行压力和代码审查来实现的。