packetie packetie - 11 months ago 58
C++ Question

Convert "void*" to int without warning

I need to convert "void*" to int, but compiler keeps giving me warning.
Wonder if there is a way to change the code so that compiler will not complain. This occurs a lot in the code base, especially when passing an argument to starting a new thread.

$ g++ -fpermissive In function ‘void dummy(void*)’: warning: cast from ‘void*’ to ‘int’ loses precision [-fpermissive]
int x = (int)p;

Here is the simple code "":

#include <stdio.h>

extern void someFunc(int);
void dummy(int type, void *p) {
if (type == 0) {
int x = (int)p;
} else if (type == 1) {
printf("%s\n", (char*)p);

int main(int argc, char *argv[]) {
void *p = (void*)5;
return 0;


I understand that I will lose precision. It's intended sometimes. What I need is to have a way to remove the warning in places I know for sure it's safe. Sorry for not making it clear earlier.


Updated the code snippet to be a little less non-trivial to illustrate the point. The parameter needs to pass different type of values. I need a way to cast without generating warning.

Answer Source

You are probably looking for something along the lines of

int x = static_cast<int>(reinterpret_cast<std::uintptr_t>(p));

This is not strictly guaranteed to work: perhaps surprisingly, the standard guarantees that a pointer converted to a large enough integer and back to a pointer results in the same value; but doesn't provide a similar guarantee for when an integer is converted to a pointer and back to the integer. All it says about the latter case is

[expr.reinterpret.cast]/4 A pointer can be explicitly converted to any integral type large enough to hold it. The mapping function is implementation-defined. [ Note: It is intended to be unsurprising to those who know the addressing structure of the underlying machine. —end note ]

Hopefully, you know the addressing structure of your machine, and won't be surprised.