错误:从'void *'转换为'int'会在makefile中丢失精度[-fpermissive]

时间:2014-08-25 15:26:37

标签: c++ c gcc casting 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 $<

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

提前致谢。

4 个答案:

答案 0 :(得分:4)

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

在您的平台上,指针不适合int。如果您将指针强制转换为整数,则应该使用intptr_t或来自uintptr_t的{​​{1}}保证足够大。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

问题与您的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中定义的<stdint.h><cstdint>类型保证能够保存转换后的void*指针值而不会丢失信息(以及如果没有整数类型符合条件,则不会定义)。 int不是,将指针转换为int很容易丢失信息。

答案 3 :(得分:-1)

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

相关问题