C++ 可变长度数组 (VLA) 警告
Posted
技术标签:
【中文标题】C++ 可变长度数组 (VLA) 警告【英文标题】:C++ Variable length array (VLA) warnings 【发布时间】:2014-04-11 09:20:19 【问题描述】:我在 SO 上阅读了有关 VLA 的不同答案,但找不到答案。就我而言,我有一个分配内存的函数:
template<typename T>
void allocMemory(T *&data, const size_t numElems)
#ifdef PINNED_MEMORY
// allocate pinned memory
#else
data = new T[numElems];
#endif
现在,我有一个使用此方法的向量类:
template<typename T>
class MyVec
T *data;
size_t size;
public:
MyVec(size_t _size): size(_size)
allocMemory<T>(data, size); // gives VLA warning
;
当我使用 nvcc (V0.2.1221) 编译器编译它时会发生这种情况,我猜它在下面使用 gcc 编译器(?)实际警告是:
myvec.h:16:6: 警告:ISO C++ 不支持可变长度数组类型 [-Wvla] 数据 = 新 T[numElems];
【问题讨论】:
你试过allocMemory<T>(data, size)
吗?
您收到的实际错误信息是什么?
@Marius 哎呀。是的,它是源代码中的 allocMemorynew T[num]
根本不是可变长度数组。如果你有int i; int j[i];
,你称之为VLA。
如果这是使用 NVCC 编译的,请确保错误不在其他地方,或者您在某处有一个 CUDACC 宏,以便您真正编译其他部分coe
【参考方案1】:
我认为你没有以正确的方式编译你的项目。
尝试使用流动的make文件。
CUDA_INSTALL_PATH := /usr/local/cuda
CXX := g++
CC := gcc
LINK := g++ -fPIC
NVCC := nvcc
#Includes
INCLUDES = -I. -I$(CUDA_INSTALL_PATH)/include
#Common flags
COMMONFLAGS += $(INCLUDES)
NVCCFLAGS += $(COMMONFLAGS)
CXXFLAGS += $(COMMONFLAGS)
CFLAGS += $(COMMONFLAGS)
LIB_CUDA := -L$(CUDA_INSTALL_PATH)/lib -lcudart
#OBJS = GpuSolver.cu.o main.cpp.o
OBJS = main.cu.o a.cpp.o # your files
TARGET = a.out
LINKLINE = $(LINK) -o $(TARGET) $(OBJS) $(LIB_CUDA)
.SUFFIXES: .c .cpp .cu .o
%.c.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
.cu.o: %.cu
$(NVCC) $(NVCCFLAGS) -c $< -o $@
%.cpp.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
$(TARGET): $(OBJS) "makefile" #your makefile file name
$(LINKLINE)
【讨论】:
CUDA_INSTALL_PATH?以上是关于C++ 可变长度数组 (VLA) 警告的主要内容,如果未能解决你的问题,请参考以下文章