错误:从’void *’转换为’int’会在makefile中丢失精度

在ubuntu 12.04 LTS(64位)上编译以下makefile时遇到此错误:

Ana.cxx:21:46: error: cast from 'void*' to 'int' loses precision [-fpermissive] 

在这一行:

 21 : TThread::Printf("Start of Ana %x \n" ,(int)ptr); 

这是makefile:

 ObjSuf = o SrcSuf = cxx DllSuf = so ExeSuf = OutPutOpt = -o CXXFLAGS = -g -Wall -fPIC -DOSF1 CXX = g++ CCFLAGS = -g -Wall -DOSF1 CC = gcc LD = g++ LDFLAGS = -g SOFLAGS = -shared ROOTCFLAGS := $(shell root-config --cflags) -DFILL_ON_FLY ROOTLIBS := $(shell root-config --libs) -lNew -lThread -lMinuit -lPhysics ROOTGLIBS := $(shell root-config --glibs) -lNew -lThread EVENTO = BINAEvent.$(ObjSuf) Ana.$(ObjSuf) BINAEventDict.$(ObjSuf) mwpc_software.o tcpip.o Genbood.o EVENTS = BINAEvent.$(SrcSuf) Ana.$(SrcSuf) BINAEventDict.$(SrcSuf) mwpc_software.c tcpip.c Genbood.c EVENTLIB = $(ROOTGLIBS) EVENTEXE = ana OBJS = $(EVENTO) .SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(DllSuf) .PHONY: Aclock Hello Tetris $(EVENTEXE): $(OBJS) $(LD) $^ $(ROOTLIBS) $(OutPutOpt) $@ @echo "$@ done" clean: @rm -f $(OBJS) core *~ *Dic* ana *.o .SUFFIXES: .$(SrcSuf) BINAEvent.$(ObjSuf): BINAEvent.h BINAEventDict.$(SrcSuf): BINAEvent.h BINAEventLinkDef.h @echo "Generating dictionary $@..." @rootcint -f $@ -c $^ .$(SrcSuf).$(ObjSuf): $(CXX) $(CXXFLAGS) $(ROOTCFLAGS) -c $< .c.$(ObjSuf): $(CXX) $(CXXFLAGS) $(ROOTCFLAGS) -c $< 

投这个的正确方法是什么?

提前致谢。

该错误与makefile无关。 错误位于源中,在错误显示的行上。

在您的平台上,指针不适合int 。 如果你将一个指针转换为一个整数,你应该使用stdint.h intptr_tuintptr_t来保证它足够大。

我不知道TThread::Printf是什么,它不是标准的。 但是用printf打印指针地址的常用方法是将指针传递给void*并使用%p格式说明符。 这也可能是TThread::Printf的情况。

int (32位)类型不足以容纳64位指针void*

这个问题与你的Makefile无关; 这是您的C ++源代码中的错误。 幸运的是,你已经向我们展示了错误。

在C中打印指针值的正确方法是使用%p说明符,它需要类型为void*的参数:

 TThread::Printf("Start of Ana %p\n", (void*)ptr); 

ptr显然已经是void*类型,所以不需要强制转换,但是其他指针类型需要它。

这假设TThread::Printf工作方式与printf类似; 鉴于它的名称肯定应该,但它不是保证。

对于C ++,我通常建议使用带有<<运算符的C ++ I / O(对于指针,你必须小心使用char* ,它有一个重载,将其视为指向字符串的指针),但这可能不可用在这种情况下。

如果你真的想要,你可以将指针值转换为整数类型,但这很少是一个好主意,如果你只是想打印它的值,当然不是必需的。 在定义的类型uintptr_tintptr_t保证能够保存转换的void*指针值而不会丢失信息(如果没有整数类型符合条件,则不会定义)。 int不是,将指针转换为int很容易丢失信息。

我的解决方案是使用“long long”而不是“int”