错误:为函数\uuuu THROW\uuuu asm提供了初始值设定项 我试图用X86Y64 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__; ^

错误:为函数\uuuu THROW\uuuu asm提供了初始值设定项 我试图用X86Y64 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__; ^,c++,arm,g++,C++,Arm,G++,其中MyFile.h具有以下结构 // comments #pragma once // comments #include <stdbool.h> #include <stddef.h> #include <stdint.h> #include <string> //<<< line 19 … 编译器版本: GNU C++14 (Ubuntu 5.4.0-6ubuntu1~16.04.11) ver

其中MyFile.h具有以下结构

// comments
#pragma once
// comments
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <string>              //<<< line 19

…
编译器版本:

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
我开始觉得我的
Makefile
出了问题。。。

我误解了编译器选项。。。上面几行,我的makefile创建了
@。通过
文件传递定义包含

       @echo $(patsubst %, '%', $(C_DEFINES)) > $@.via
       @echo $(C_INCLUDE) >> $@.via
这些
@.via
文件作为编译的附加参数传递。虽然对于
armcc
支持
--via
,但我发现对于g++-根据-语法是
@
。因此,
@$@.via
所做的只是将
$@.via
解析为
.via

现在我仍然收到为函数提供的
初始值设定项
错误消息

更新2: 我发现了问题,并在回答部分解释了发生的事情。见下文。

根本原因 问题的起因是我重新定义了
\uuu asm
,将其替换为零(例如
\define\uu asm
),因为我还不想接触汇编代码。记得我说过要将ARM移植到x86,所以我认为消除编译错误的最简单方法是删除所有的
\u asm
指令,但不考虑这样做的影响

换句话说,当我包含
string.h
标题时,标题本身使用汇编调用,正如错误消息指出的那样:

/usr/include/wchar.h:226:20: error: initializer provided for function
       __THROW __asm ("wcschr") __attribute_pure__;
当预处理器为
(“wcschr”)
更改
(“wcschr”)
“asm”(“wcschr”)
时,编译器会出错——这是有道理的

历史的道德
不要重新定义限定符,因为它也会影响您没有直接看到的其他模块,并且更喜欢创建宏来更改它们(例如
\uuu asm
/*\uu asm*/
)或者在您的代码库中运行
sed

错误不在myfile.h第19行,而是在
/usr/include/wchar.h
@PaulOgilvie中,但这是Gnu libc的一部分,所以我认为这不是错误,或者您可以再详细说明一下吗?我自己也遇到了这个错误。我试图在x86环境中对我的ARM程序运行单元测试。当我在Windows中用Cygwin G++编译代码时,它编译得很好。但是,当我尝试在Linux上使用G++进行编译时,我得到了您遇到的错误。
       @echo $(patsubst %, '%', $(C_DEFINES)) > $@.via
       @echo $(C_INCLUDE) >> $@.via
/usr/include/wchar.h:226:20: error: initializer provided for function
       __THROW __asm ("wcschr") __attribute_pure__;