gpt4 book ai didi

c - Hexagon 编译器遇到 `typedef struct mystruct *mystruct` 问题

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:47 27 4
gpt4 key购买 nike

<分区>

我在头文件中有这一行:

typedef struct mystruct *mystruct;

以及.c文件中相应的结构体定义。相当标准的做法。

我遇到这个编译错误:

fatal error: typedef redefinition with different types ('struct mystruct *' vs mystruct')

这是使用来自 Hexagon 3.0 SDK 的 Hexagon 工具编译器 (7.2.12)。它正式为 QuIC LLVM Hexagon Clang 版本 7.2.12。为 Snapdragon Flight 打造。据我所知,这应该有效。它适用于 x86_64-pc-linux-gnu 的 Ubuntu clang 版本 3.5.0-4ubuntu2~trusty2(基于 LLVM 3.5.0)。

这里有什么问题?这种类型的 typedef 是不是在编译器中实现的 C 的新功能,或者更确切地说,像这些常见的编译器差异?

编辑:实际上结构是在 .c 文件中定义的,而不是 .cpp 文件。添加了显示使用 Ubuntu clang 编译的 Makefilemake 输出,以及带有麻烦的 typedef 语句的头文件顶部。最后运行一个测试,所有 105 个测试都通过。

Edit2:请参阅 Jonathan Leffler 的回答,了解此方法有效与无效的情况。

ringbuf.h:

#include <stddef.h>
#include <sys/types.h>

#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

typedef struct ringbuf_t *ringbuf_t;

生成文件:

CC=clang
CFLAGS=-O0 -g -Wall -Wpointer-arith -ftrapv -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error

# or, for gcc...
#CC=gcc
#CFLAGS=-O0 -g -Wall

LD=$(CC)
LDFLAGS=-g

test: ringbuf-test
./ringbuf-test

coverage: ringbuf-test-gcov
./ringbuf-test-gcov
gcov -o ringbuf-gcov.o ringbuf.c

valgrind: ringbuf-test
valgrind ./ringbuf-test

help:
@echo "Targets:"
@echo
@echo "test - build and run ringbuf unit tests."
@echo "coverage - use gcov to check test coverage of ringbuf.c."
@echo "valgrind - use valgrind to check for memory leaks."
@echo "clean - remove all targets."
@echo "help - this message."

ringbuf-test-gcov: ringbuf-test-gcov.o ringbuf-gcov.o
gcc -o ringbuf-test-gcov --coverage $^

ringbuf-test-gcov.o: ringbuf-test.c ringbuf.h
gcc -c $< -o $@

ringbuf-gcov.o: ringbuf.c ringbuf.h
gcc --coverage -c $< -o $@

ringbuf-test: ringbuf-test.o libringbuf.so
$(LD) -o ringbuf-test $(LDFLAGS) $^ -L$(MY_LIBS_PATH) -lringbuf

ringbuf-test.o: ringbuf-test.c ringbuf.h
$(CC) $(CFLAGS) -c $< -o $@

libringbuf.so: ringbuf.o
$(CC) -shared -o libringbuf.so ringbuf.o
cp ./libringbuf.so $(MY_LIBS_PATH)/

ringbuf.o: ringbuf.c ringbuf.h
$(CC) $(CFLAGS) -fPIC -c $< -o $@
cp ./ringbuf.h $(MY_INCLUDES_PATH)/

clean:
rm -f ringbuf-test ringbuf-test-gcov *.o *.so *.gcov *.gcda *.gcno

.PHONY: clean

制作输出:

clang -O0 -g -Wall -Wpointer-arith -ftrapv -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error -c ringbuf-test.c -o ringbuf-test.o 
clang -O0 -g -Wall -Wpointer-arith -ftrapv -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error -fPIC -c ringbuf.c -o ringbuf.o
cp ./ringbuf.h /home/eric/Includes/
clang -shared -o libringbuf.so ringbuf.o
cp ./libringbuf.so /home/eric/Libs/
clang -o ringbuf-test -g ringbuf-test.o libringbuf.so -L/home/eric/Libs -lringbuf
./ringbuf-test

Edit3:这实际上仅适用于 Hexagon-clang 编译器。有问题的是该模块存在于较大程序的编译过程中。我认为它试图将此代码编译为 C++。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com