在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 $<
投这方法的正确方法是什么?
提前致谢。
答案 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_t
或intptr_t
中定义的<stdint.h>
和<cstdint>
类型保证能够保存转换后的void*
指针值而不会丢失信息(以及如果没有整数类型符合条件,则不会定义)。 int
不是,将指针转换为int
很容易丢失信息。
答案 3 :(得分:-1)
我的解决方案是使用“long long”而不是“int”