2016-10-18 7 views
2

Ich muss einen Zeiger auf eine lange lange werfen, und würde es vorziehen, auf eine Weise zu machen, dass gcc nicht auf 32 oder 64-Bit-Architekturen über die Konvertierung von Zeiger zu Ints von beklagen andere Größe. Und bevor jemand fragt, ja, ich weiß, was ich mache, und ich weiß, worauf ich hinauswürfe - mein spezifischer Anwendungsfall ist es, eine Stack-Spur (die Zeiger selbst sind das Thema hier) über das Netzwerk zu senden Ein Anwendungsfehler tritt auf, daher gibt es keine Garantie, dass Absender und Empfänger dieselbe Wortgröße haben. Ich habe daher eine Struktur aufgebaut, die die Nachrichtendaten enthält, unter anderem mit einem Array von "unsigned long long" -Werten (garantiert mindestens 64 Bits), um die Zeiger zu halten. Und ja, ich weiß "lange lange" ist nicht garantiert zu nur 64-Bit, aber alle Compiler, die ich für Quelle und Ziel verwenden, implementieren es als 64-Bit. Da der Header (und die Quelle) mit der Struktur auf beiden Architekturen verwendet wird, erscheint "uintptr_t" nicht als praktikable Lösung (da die Größe gemäß stdint.h von der Architektur abhängig ist).Explizite Umwandlung von Zeiger auf lange lange

Ich dachte daran, mit anonymen Gewerkschaften heikel zu werden, aber das fühlt sich ein wenig zu hackisch an ... Ich hoffe, dass es einen Weg mit Doppelzauber oder etwas in C99 gibt (seit anonyme Gewerkschaften warenn) Standard bis C11).

EDIT:

typedef struct error_msg_t { 
    int msgid; 
    int len; 
    pid_t pid; 
    int si_code; 
    int signum; 
    int errno; 
    unsigned long long stack[20]; 
    char err_msg[]; 
} error_msg_t; 
... 
void **stack; 
... 
msg.msgid = ERROR_MSG; 
msg.len = sizeof(error_msg_t) + strlen(err_msg) + 1); 
msg.pid = getpid(); 
... 
for (i=0; i<stack_depth; i++) 
    msg.stack[i] = (unsigned long long)stack[i]; 

Warnung (auf einer 32-Bit-Kompilierung) etwa auf ganzzahlige unterschiedlicher Größe Gießen erfolgt in der letzten Zeile.

+0

Zeigen Sie uns Ihren Code –

+7

'uint64_t' wäre eine bessere Wahl. – jxh

+0

'uint64_t' ergibt die gleiche Warnung. – ereisch

Antwort

1

Wahrscheinlich ist Ihre beste Wette, Doppel-Cast, um es dem Compiler zu buchstabieren, was Sie tun möchten (as suggested by Max).

Ich würde empfehlen, es in ein Makro zu wickeln, so dass die Codeabsicht aus dem Makronamen klar ist.

#define PTR_TO_UINT64(x) (uint64_t)(uintptr_t)(x) 
+0

Nicht Makro, was Sie 'statisch inline' können. –

+0

@Rhymoid: Ich denke, ein Makro ist eine bessere Wahl hier, denn während Sie möchten, dass der Code lesbar ist, wollen Sie immer noch die Vorstellung vermitteln, dass etwas Funky passiert. – jxh