Wenn size_t
nicht definiert ist, heißt es, dass die einzige portable Möglichkeit, die Definition dafür zu erhalten, ist, einen der Header aufzunehmen, die es hat.Betrachtet `size_t` und die Zeigertypen, die sie messen
Allerdings, wie ich es verstehe, ist die Verwendung einer #include
in einer Header-Datei schlechte Praxis, weil Header keine anderen Header gehören sollte, nicht wahr?
Es ist also die Aufgabe des Programmierers, einen Weg zu finden, um sicherzustellen, dass ein Header kompiliert wird, ohne in eine schlechte Programmierpraxis zu fallen.
Wie ich es verstehe, ist der size_t
Typ der kleinste Typ, der garantiert das längste Objekt unterstützt, das Ihr System verarbeiten kann. Z.B. Wenn Sie ein 64-Bit-Betriebssystem ausführen, sollte size_t
64 Bit sein, denn so arbeiten RAM und Zeiger in und für sich.
Bei Pointern stellt jeder gegebene Pointer einen Offset vom 0. Byte im RAM dar, wobei die Dereferenzierung dieses Offsets den an diesem Offset gespeicherten Wert liefert. Und die CPU (in diesem Fall eine 64-Bit-CPU) hat die volle Verfüg- barkeit, auf die 18-Trillionen-Bytes zuzugreifen, die sie mit der größten Einheit adressieren kann, die sie unterstützt, auch bekannt als 64-Bit-Integer , aka ein Zeiger.
Also, sind nicht size_t
und irgendein gegebener Zeigertyp garantiert, um die gleiche Größe zu sein?
Die Frage ist dann, welche der folgenden die beste Praxis für einen bestimmten Header würde:
void some_function(ptr *some_object, size_t n);
...
Die Möglichkeiten zu sein scheinen:
#include <stddef.h>
// would definitely work...but including a header in a header is ugly practice
typedef long long unsigned size_t
// to account for win64 making `long` 32-bits...but it's possibly non-portable
typedef char * size_t
// I like this one...but am not 100% sure about how portable it is
Des Weiteren gibt es irgendwelche Gründe Warum wäre die Verwendung eines Zeigers für die Definition von size_t unerwünscht? Es scheint, als ob es in Ordnung sein sollte. Wie ich es verstehe, ist ein Zeiger garantiert die volle Größe eines Registers zu übernehmen und damit die gleiche Größe wie die Architektur sollte die „ideale“ size_t
_Wie ich verstehe, ist die Verwendung eines # include in einer Header-Datei schlechte Übung, weil Header keine anderen Header enthalten sollten, oder? Wo auf der Welt haben Sie diesen Unsinn gehört? Schlag sie für mich, oder? Was Sie in den Headern nicht tun sollten, ist 'using namespace' auf der obersten Ebene (innerhalb von Klassen- und Funktionskörpern ist es jedoch in Ordnung). – Cubic
Btw Ich versuche diese Frage zu schließen, da sie auf einem wirklich großen Missverständnis beruht, aber ich weiß nicht, welcher genaue Grund das wäre. Etwas in der Off-Topic-Kategorie würde ich vermuten? – Cubic
@Cubic Ich denke, ich erinnere mich daran, es in einem Code-Review zu lesen. –