Moduły c oraz #define zamiast using.

0

Cześć, mam 2 pytanie dotyczące modułów w c.
Po pierwsze: dla wygody chce ustawić makro aby zamiast char* pisać string. W C++ użyłbym słów using ale w c zrobiłem tak:

#ifndef string;
#define string char*
#endif

Czy jest to dobra praktyka? Czy powinienem użyć zamiast tego po prostu typedef char* string? Uwzględniając to że w różnych modułach mogę sobie takie samo makro ustawić?

Pytanie 2:
W module chce mieć jakiś struct i funkcje operujące na tej strukturze. Skoro będę udostępniał interface do operacji na tej strukturze (wspomniane funkcje) to czy powinienem umieścić deklaracje struktury w pliku .c modułu? Tak aby 'ukryć' ja przed osobą która sobie zaimportuje moduł?

Wiem że nie dałem żadnego konkretnego kodu, ale chodzi mi bardziej o dobre praktyki i zwyczaje niż o konkretny problem. Z góry dzięki za odpowiedź.

2

po pierwsze, chyba nie rozumiesz słowa kluczowego using w C++. String w C++ to znacznie więcej niż prosty alias do char*, bo ma masę metod do użycia. Słowo kluczowe using pozwala na pominięcie nazwy przestrzeni nazw (w tym przypadku string, zamiast std::string).

po drugie, lepiej użyć typedef, bo wtedy kompilator będzie wiedział co się dzieje i będzie używał tej nazwy. Może nie wielka to różnica w tym przypadku, ale dobrym zwyczajem jest nie używać makr jeśli nie jest to konieczne.

Co do pytania drugiego, typowym sposobem na ukrycie pól struktury jest ukrycie defiinicji w implementacji i używanie wskaźników w publicznym API (nie możesz tworzyć instancji typu, którego definicji nie znasz, wskaźnik jak najbardziej), czyli z grubsza tak jak piszesz.

1
Spejson_ napisał(a):

Pytanie 2:
W module chce mieć jakiś struct i funkcje operujące na tej strukturze. Skoro będę udostępniał interface do operacji na tej strukturze (wspomniane funkcje) to czy powinienem umieścić deklaracje struktury w pliku .c modułu? Tak aby 'ukryć' ja przed osobą która sobie zaimportuje moduł?

Wiem że nie dałem żadnego konkretnego kodu, ale chodzi mi bardziej o dobre praktyki i zwyczaje niż o konkretny problem. Z góry dzięki za odpowiedź.

Popatrz na demo

A makr unikaj jak ognia. Jeśli się coś da zrobić bez nich to prawie na pewno jest to lepsze rozwiązanie.

1

Zgadzam się z przedmówcami, psie Sabo nie idź tą drogą.
Od siebie dodam: jak masz dylemat (czy też dualizm) C - C++ to porzuć C i pisz w C++. Fakt, będziesz musiał uzupełniać wiedzę, ale już zacząłeś.
Najmniejszego sensu nie ma powoływania fałszywego 'stringa', oszukany char * przysporzy wielu problemów, NIC nie jest zgodne pomiędzy std::string'iem a char *

Ukrywanie: zamiast struktury użyj klasy C++ z polami prywatnymi, metodami, być może niepublicznym konstruktorem. Twój cel oddzielenia widza od implementacji da się zrobić profesjonalnie.
Raz użyłem pól void * w podobnej strukturze, ponad 20 lat temu, rzecz w tym, że nie było ŻADNYCH ochotników do naruszania prywatności. Wymyślamy sobie sztuczne scenariusze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1