Ошибка: инициализатор предоставлен для функции __THROW __asm
Я пытаюсь перенести библиотеку ARM-C для компиляции с x86_64 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
где-то не так...
Я неправильно понял параметр компилятора... Несколькими строками выше мой make-файл создает @.via
файлы, передающие DEFINES и INCLUDES
@echo $(patsubst %, '%', $(C_DEFINES)) > $@.via
@echo $(C_INCLUDE) >> $@.via
и те @.via
файлы передаются в качестве дополнительных аргументов для компиляции. Хотя дляarmcc
в --via
поддерживается см. здесь, я обнаружил, что для g++ - согласно документу gcc - синтаксис@<your_file>
. Итак, что@$@.via
просто анализирует $@.via
к <your_file>.via
.
Теперь я все еще получаю initializer provided for function
сообщение об ошибке.
ОБНОВЛЕНИЕ 2:
Я нашел проблему и объяснил, что произошло, в разделе ответов. Смотри ниже.
1 ответ
Основная причина
Проблема возникла из-за того, что я переопределил __asm
быть замененным ничем (например, #define__asm
) так как я пока не хотел трогать ассемблерный код. Помните, что я сказал, что портирую ARM на x86, поэтому я подумал, что самый простой способ избавиться от ошибок компиляции - удалить все эти ошибки.__asm
инструкции, но не принимая во внимание последствия таких действий.
Другими словами, когда я включил string.h
заголовок, сам заголовок использует вызов сборки, как указано в сообщении об ошибке:
/usr/include/wchar.h:226:20: error: initializer provided for function
__THROW __asm ("wcschr") __attribute_pure__;
и когда препроцессор изменил __asm("wcschr")
за ("wcschr")
компилятор обнаруживает ошибку - что имеет смысл.
Мораль истории
Не переопределяйте квалификаторы, так как это также повлияет на другие модули, которые вы не видите напрямую, и предпочитаете создавать макрос, чтобы просто изменить их (например, __asm
за /*__asm*/
) или просто беги sed
в вашей кодовой базе.