Frage zum Präprozessor
-
Ja klar ich bin ja doof

Aber gehts irgendwie mit Templates?
-
Nein, das geht auch nicht

BR
evilissimo
-
#define NUM_ELEMENTS(x) (sizeof((x)) / sizeof((x)[0]))
-
eher so:
#define NUM_ELEMENTS(x) (sizeof(x)-1)
-
.?. schrieb:
#define NUM_ELEMENTS(x) (sizeof((x)) / sizeof((x)[0]))Funktioniert aber auch nur bei arrays und auch nur dann wenn das für den compiler "sichtbar" ist.
sprich:
int main() { char blub[] = "Foobar"; size_t blub_size = NUM_ELEMENTS(blub) - 1; }geht. Aber folgendes nicht:
void foobar( char blub[] ) { size_t blub_size = NUM_ELEMENTS(blub) -1; } int main() { char blub[] = "Foobar"; foobar(blub); }Dort würde aber wiederum das gehen:
template < size_t N > void foobar( char (&blub)[N] ) { std::cout << N - 1<< std::endl; } int main() { char blub[] = "Foobar"; foobar(blub); }Das geht aber auch nur direkt. So würde das natürlich dann wieder nicht gehen.
template < size_t N > void foobar2( char (&blub)[N] ) { std::cout << N - 1<< std::endl; } void foobar( char blub[] ) { foobar2(blub); } int main() { char blub[] = "Foobar"; foobar(blub); }Da das ganze sehr beschränkt einsatzfähig ist und auch nur für char-Arrays funktioniert ist es nicht wirklich immer hilfreich.
BR
evilissimo
-
.filmor schrieb:
Wie kann man mithilfe des Präprozessors die Länge eines String-Literals bestimmen?
-
kommt drauf an wie man das string-literal angibt.
const char* pStr = "Hallo"; // geht nicht char str[] = "Hallo"; // geht
-
'#' schrieb:
kommt drauf an wie man das string-literal angibt.
const char* pStr = "Hallo"; // geht nicht char str[] = "Hallo"; // gehtNein. Weder pStr noch str sind String Literale.
DAS ist ein String Literal: "foobar"
und dafür funktioniert auch#define NUM_ELEMENTS(x) (sizeof(x)-1)
-
.filmor schrieb:
Wie kann man mithilfe des Präprozessors die Länge eines String-Literals bestimmen?
Ich würde dir auch das Makro empfehlen. Du kannst zwar auch die bereits angesprochene Funktion benutzen
template < size_t N > size_t foobar2( char (&)[N] ) { return N; }Bedenke aber, das Makro liefert einen konstanten Ausdruck, die Funktion nicht.
-
Danke für die Vorschläge, aber mit sizeof oder Metaprogrammen gehts nicht, dass ist schon zu spät. Es geht darum, dass ich in einer Präprozessorschleife (aus Boost.Preprocessor) einen String so zerstückeln will, dass ich ihn zu einem Typen machen kann (so wie int_<3> aus Boost.MPL), aber das scheint ja nicht möglich zu sein.