Operator weitergeben

Gast #6269391
Lesenswert?

Hallo!

Ich habe eine Funktion, die als letztes Argument einen ...-Operator 
verwendet.
Nun soll in Abhängigkeit der Konfiguration innerhalb dieser Funktion 
eine andere aufgerufen werden, wo diese nicht näher spezifizierten 
Argumente ebenfalls über einen ...-Operator weitergegeben werden sollen.
Wie geht das?
1
void blub(int a, int b, ...)
2
{   
3
    va_list ap;
4

5
    <some code>    
6
    va_start(ap, b);
7
    <some code>
8
    va_end(ap);
9
    <some code>
10

11
    return;
12
}
13

14
void bla(char a, int b, int c, ...)
15
{  
16
    <some code>  
17
    blub(c, b, ...);
18
    <some code>      
19
}

Danke & Grüße
Blub
Gast #6269499
Lesenswert?

Geht doch!
1
void blub(int a, int b, ...)
2
{   
3
  va_list ap;
4

5
  <some code>    
6
  va_start(ap, b);
7
  <some code>
8
  va_end(ap);
9
  <some code>
10

11
  return;
12
}
13

14
void bla(char a, int b, int c, ...)
15
{    
16
  va_list org;
17
  
18
  va_start(org, c);
19
  blub(c, b, org);
20
  va_end(org);      
21
}
Moderator Persönliche Seite #6269507
Lesenswert?

Wenn ein Compiler diesen Mischmasch tatsächlich compilieren und 
sinnvoll abarbeiten sollte, dann wäre das reiner Zufall.

Natürlich kannst du auch eine va_list als "..."-Argument übergeben – 
aber das ist nicht das, wie <stdarg.h> gedacht und konzpiert worden ist. 
Eine va_list sollte man schon genau da übergeben, wo auch eine va_list 
vom Aufgerufenen erwartet wird.
Moderator #6269583
Lesenswert?

Blub schrieb:
> Geht doch!

Natürlich ist der Code (wenn man die <some code>-Zeilen auskommentiert)
standardkonformes C, weswegen der Compiler keine Fehlermeldung ausgibt.
"Standardkonform" heißt aber noch lange nicht "erwartungsgemäß
funktionierend" :)

Versuch mal, in blub() die mit <some code> markierte Stelle mit
sinnvollem Code auszufüllen:

1
  va_start(ap, b);
2
  <some code>
3
  va_end(ap);

Dann wirst du sehr wahrscheinlich merken, dass deine Art und Weise,
stdarg.h zu verwenden, nicht zum gewünschten Ziel führt.

Du könntest an dieser Stelle natürlich aus ap mit va_arg eine weitere
va_list ap2 auslesen, diese mit einem weiteren va_start initialisieren
und dann aus ap2 mit va_arg die eigentlichen Argumente auslesen. Das
wäre dann so ziemlich die unsinnigste, umständlichste, verworrene und
fehlerträchtigste Methode, dein Ziel zu erreichen, für das es einen ganz
geradlinigen Weg gibt :)

Blub schrieb:
> wo diese nicht näher spezifizierten Argumente ebenfalls über einen
> ...-Operator weitergegeben werden sollen.

Was sind die Gründe dafür, dass das so sein soll?

Übergib einfach die va_list als Argument (ohne die ...), und der Käse
ist gegessen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren