В настоящее время я немного озадачен концепцией сокрытия информации C -структур.
Фон этого вопроса - встроенный c проект с почти нулевым знанием OOP.
До сих пор я всегда объявлял свои структуры typedef внутри заголовочного файла соответствующего модуля. Таким образом, каждый модуль, который хочет использовать эту структуру, знает тип структуры.
Но после проверки MISRA- C я обнаружил предупреждение средней серьезности: MISRAC2012-Dir-4.8 - реализация структуры подвергается излишнему раскрытию к единице перевода.
После небольшого исследования я обнаружил концепцию сокрытия информации C -структур, ограничивая видимый доступ членов структуры к частной области.
Я быстро попробовал простой пример, который выглядит следующим образом:
struct_test.h
//struct _structName;
typedef struct _structName structType_t;
struct_test. c
#include "struct_test.h"
typedef struct _structName
{
int varA;
int varB;
char varC;
}structType_t;
main. c
#include "struct_test.h"
structType_t myTest;
myTest.varA = 0;
myTest.varB = 1;
myTest.varC = 'c';
Это приводит к ошибке компилятора, что для main. c Размер myTest неизвестен. И, конечно, это так. Main. c знает только, что существует структура типа structType_t и ничего больше.
Поэтому я продолжил свое исследование и наткнулся на концепцию непрозрачных указателей.
Итак, я попробовал вторую попытку:
struct_test.h
typedef struct _structName *myStruct_t;
struct_test. c
#include "struct_test.h"
typedef struct _structName
{
int varA;
int varB;
char varC;
}structType_t;
main. c
#include "struct_test.h"
myStruct_t myTest;
myTest->varA = 1;
И я получаю ошибку компилятора: разыменование указателя на неполный тип struct _structName
Так что, очевидно, я не понял основную c концепцию этого метода. Моя главная путаница заключается в том, где будут находиться данные объекта struct?
До сих пор у меня было понимание, что указатель обычно указывает на «физическое» представление типа данных и читает / записывает содержимое на соответствующий адрес.
Но с помощью описанного выше метода я объявляю указатель myTest, но никогда не задаю адрес, на который он должен указывать.
Я взял идею из этого поста: Что такое непрозрачный указатель в C?
В сообщении упоминается, что доступ обрабатывается с помощью методов интерфейса set / get, поэтому я попытался добавить одно подобное:
void setVarA ( _structName *ptr, int valueA )
{
ptr->varA = valueA;
}
Но это также не работает, потому что теперь он говорит мне, что _structName
неизвестно ... Так что я могу получить доступ к структуре только с помощью дополнительных методов интерфейса и, если да, как я могу добиться этого в моем простой пример?
И мой главный вопрос все еще остается, где объект моей структуры находится в памяти. Я знаю только концепцию указателя:
varA - Адрес: 10 - Значение: 1
ptrA - Адрес: 22 - Значение: 10
Но в этом примере у меня есть только
myTest - Адрес: xy - Значение: ??
У меня проблемы с пониманием, где находится "физическое" представление соответствующего указателя myTest
?
Более того, я я не вижу преимуществ в том, чтобы делать это в сравнительно небольших проектах, где я являюсь производителем и потребителем модулей.
Может кто-нибудь объяснить мне, является ли этот метод действительно целесообразным для малых и средних встроенных проектов? с 1-2 разработчиками, работающими с кодом? В настоящее время кажется, что все эти методы указателя интерфейса требуют больше усилий, чем просто объявление структуры в моем заголовочном файле.
Заранее спасибо