Ich arbeite mit einem eingebetteten System, und ich bin am Ende mit einer Tonne von HW-Schnittstellen #define
Makros. Ich möchte alle diese in eine separate Datei (für OOP-Ness), aber ich weiß nicht, der beste Weg zu #include
dass. Bringe ich sie alle in eine .c-Datei und schließe sie dann ein? Scheint albern, diese in eine .h-Datei zu legen.Wo stelle ich all diese funktionsähnlichen #defines in C?
Antwort
Ich sehe nichts falsch mit der .h-Datei.
Ja, das ist Standard. – caf
Nun, die allgemeine Faustregel lautet: Funktionsprototypen befinden sich in .h-Dateien und ihre Implementierungen in .c-Dateien. In diesem Fall würde ich die Implementierungen in die .h-Dateien einfügen - normalerweise nicht dort, wo jemand nach ihnen suchen würde. – Tristan
@Tristan: Was für Funktionen gilt, gilt nicht unbedingt für Makros; es ist auch üblich, dass Inline-Funktionen in Header-Dateien gespeichert werden – Christoph
Diese sollten in den .h
Dateien gehen. Die andere Option ist eine .c
Datei, und das würde die Verwendung #include
erfordern, um eine .c
Datei einzuschließen, die Leute auf jeden Fall verwirren wird - sowie Ihr Makefile verwirrend, wenn es die Standardannahme verwendet, die jede .c
Datei direkt a entspricht kompiliert .o
Datei.
Das normale Muster ist, dass .h
Dateien für Dinge sind, die an anderen Orten (und insbesondere an mehreren anderen Orten) enthalten sind, und dass .c
Dateien für Dinge sind, die einmal in Objektdateien kompiliert werden.
Somit sind die folgenden Dinge normalerweise in .h
Dateien gehen:
- Funktionsprototypen
- Constant Erklärungen
- Globale Variable
extern
Erklärungen - Inline Funktionsdefinitionen
- Typdefinitionen
- und Makro-Definitionen, wie zum Beispiel was Sie fragen Über.
Umgekehrt sind die folgenden Dinge normalerweise in .c
Dateien gehen:
- Globale Variable Definitionen
- Funktionsdefinitionen, die in den Objektcode kompiliert werden und verknüpft
Der Fall " Funktionsdefinitionen gehen nur in .c
Dateien "ist einfach der degenerierte Fall, wenn Sie keine Inline-Funktionen haben.
In C++, wo viele Funktionen in Vorlagenform definiert sind und daher die Definitionen bei ihrer Verwendung enthalten sein müssen, gehen diese Definitionen sehr oft in die Datei .h
(oder .hpp
, oder was auch immer). Diese Art von Dingen hat definitiv einen Präzedenzfall.
Ich empfehle das nicht unbedingt, aber habe es in den letzten 10 Jahren in einigen eingebetteten Projekten gesehen: Inline-Funktionen wie .inl.
Brooks gliedert die Verantwortlichkeiten gut aus. Sie sollten erwägen Inline- und Makrodefinitionen der gewöhnlichen Funktionsprototypen zu trennen und so:
#include "prototypes.h"
#include "macros.inl"
int foo(void);
int bar(char);
Ihr Endziel ist die Konsistenz: alle Layouts Entscheidungen diejenigen, die Sie zum Erfolg unterstützen sollten.
Legen Sie sie dort hin, wo Sie sie brauchen.
Wenn Sie es nur für eine Datei benötigen, dann legen Sie es an der Spitze dieser Datei.
Wenn Sie es für mehrere Dateien benötigen, dann legen Sie es in eine Header-Datei.
- 1. C++ - Zusammensetzung - muss ich all diese Funktionen einpacken?
- 2. Einrückung #defines
- 3. Übergabe von C/C++ #defines zu makefile
- 4. Facebook App: Wo stelle ich offline_access Anfrage?
- 5. Wie kann ich herausfinden, wo all diese zusätzlichen sqlite3-Selects in meiner Rails-App generiert werden?
- 6. Java - entityExpansionLimit. Wo stelle ich das ein?
- 7. CDI: beans.xml, wo stelle ich dich hin?
- 8. Wo stelle ich reguläre Funktionen, Angularjs
- 9. Wie funktionieren all diese JavaScript OpenID-Bibliotheken?
- 10. C Import #defines von Header-Datei
- 11. Tun die QT DEFINES das Gleiche wie #define in C++?
- 12. Wo stelle ich Dienstprogrammfunktionen in mein Python-Projekt?
- 13. Wo kann ich diese externen Ressourcen
- 14. Wie vermische ich all diese Logik mit Javascript Promises?
- 15. Wo in meiner Klasse stelle ich die @ XmlElement Annotation?
- 16. Wo stelle ich Tests in ein fsharp-Projekt mit Monodevelop?
- 17. Wo sind all die javax jars?
- 18. phoneGap Startup - brauchen wir all diese Dateien?
- 19. fehlt) nach der Argumentliste, wo stelle ich es diesmal?
- 20. Zu viele Argumente für einen funktionsähnlichen Makroaufruf
- 21. FORCE INDEX mySQL ... wo stelle ich es hin?
- 22. Wie stelle ich diese Abfrage mit integrierten Grails/GORM-Methoden
- 23. Wie stelle ich fest, wo die Integer (string) Methode gehört?
- 24. DataAccess Layer und Klasse, wo stelle ich meine Funktionen ein?
- 25. Wie kann ich #defines in einer C-Datei von Python referenzieren?
- 26. Wo ist android_sdk_root? und wie stelle ich es ein?
- 27. Wo stelle ich die Vorlage für Schienen Fehlermeldungen ein?
- 28. Was verursacht all diese Fehler in meiner GUI?
- 29. Aufruf eines funktionsähnlichen Makros ohne Klammern?
- 30. QT CREATOR - wo stelle ich die/NODEFAULTLIB: Bibliothek?
FWIW: Diese werden "Makros", nicht "Funktionen" genannt. – dmckee
Warum scheint es albern, sie alle in eine .h-Datei zu setzen? – FrustratedWithFormsDesigner
@dmckee: Wir können den Unterschied aufteilen und sie "funktionsähnliche Makros" nennen, im Gegensatz zu "objektartigen Makros" - den im Standard verwendeten Begriffen. –