gpt4 book ai didi

c++ - 错误 : Initializer provided for function, __THROW __asm

转载 作者:行者123 更新时间:2023-12-02 10:23:26 24 4
gpt4 key购买 nike

我正在尝试移植要使用 x86_64 C++ 编译的 ARM-C 库,但出现以下错误:

In file included from /usr/include/c++/5/cwchar:44:0,
from /usr/include/c++/5/bits/postypes.h:40,
from /usr/include/c++/5/bits/char_traits.h:40,
from /usr/include/c++/5/string:40,
from MyFile.h:19,
/usr/include/wchar.h:226:20: error: initializer provided for function
__THROW __asm ("wcschr") __attribute_pure__;
^

其中 MyFile.h 具有以下结构
// comments
#pragma once
// comments
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <string> //<<< line 19



最初,而不是它曾经给我一个类似的错误:
In file included from MyFile.h:19:
/usr/include/string.h:73:21: error: initializer provided for function
__THROW __asm ("memchr") __attribute_pure__ __nonnull ((1));
^

编译器版本:
GNU C++14 (Ubuntu 5.4.0-6ubuntu1~16.04.11) version 5.4.0 20160609 (x86_64-linux-gnu)
compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
ldd (Ubuntu GLIBC 2.23-0ubuntu11) 2.23

编译标志:
#g++ -O3 -std=c++14 -fpermissive -Wno-system-headers -w

更新 1:

我一直在修改 Makefile ,原始版本包含 $@.via .例如:
@$(COMPILE) -M -MF $(subst .o,.d.tmp,$@) -MT $@ -E $(C_FLAGS) $@.via $< -o $@.preprocessed.c

我更改了 $@.via对于 @$@.via因为我在一个较旧的项目中看到他们是这样做的。但是,如果我离开 $@.via我只是得到:
SomeFile.c:1:1 fatal error: OneHeader.h: No such file or directory

我开始认为我的 Makefile是不是哪里错了……

我误解了编译器选项...上面几行,我的makefile创建了 @.via文件通过 定义 包括
       @echo $(patsubst %, '%', $(C_DEFINES)) > $@.via
@echo $(C_INCLUDE) >> $@.via

和那些 @.via文件作为编译的附加参数传递。而对于 armcc --via支持 see here ,我发现对于 g++ -根据 gcc doc - 语法是 @<your_file> .因此, @$@.via只是简单地解析 $@.via<your_file>.via .

现在我仍然收到 initializer provided for function错误信息。

更新 2:

我发现了问题,并在答案部分解释了发生的事情。见下文。

最佳答案

根本原因

问题是因为我重新定义了__asm被任何东西替换(例如 #define __asm ),因为我还不想接触汇编代码。请记住,我说过我将 ARM 移植到 x86,所以我认为摆脱编译错误的最简单方法是删除所有这些 __asm说明,但不考虑这样做的效果。

换句话说,当我包含 string.h header , header 本身使用程序集调用,因为错误消息指出:

/usr/include/wchar.h:226:20: error: initializer provided for function
__THROW __asm ("wcschr") __attribute_pure__;

当预处理器更改 __asm("wcschr")对于 ("wcschr")编译器遇到错误——这是有道理的。

历史的道德

不要重新定义限定符,因为它也会影响您没有直接看到的其他模块,并且更喜欢创建一个宏来更改它们(例如 __asm/*__asm*/ )或只运行 sed在你的代码库中。

关于c++ - 错误 : Initializer provided for function, __THROW __asm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58697999/

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