Повторяемая глобальная декларация в C / GCC - PullRequest
0 голосов
/ 04 декабря 2018

Короткая версия: Есть ли способ в C (и C ++, скомпилированный с GCC 6.4) неоднократно объявлять глобальную переменную в единице перевода?

Длинная версия: с какой стати я хотел бы сделать это?Ну что ж:

Я пытаюсь собрать CouchDB на Alpine Linux на ARMv6.Для этой платформы не существует готового пакета CouchDB (AFAICT).

CouchDB зависит от SpiderMonkey / mozjs (движок JavaScript Mozilla).Для этой платформы AFAICT не существует готовых пакетов mozjs (обратите внимание, что это готовых пакетов mozjs для Alpine на всех не-ARM платформах).

SpiderMonkey включает множество системобертки, например, эта версия features.h:

#pragma GCC system_header
#pragma GCC visibility push(default)
#include_next <features.h>
#pragma GCC visibility pop

На платформе установлено FORTIFY_SOURCE.Поэтому, когда стандартная библиотека C ++ #include s stdlib.h, она получает /usr/lib/fortify/stdlib.h, что делает это:

__extension__
#include_next <limits.h>

Первое, что limits.h делает, это:

#include <features.h>

После предварительной обработки это заканчивается:

__extension__
#pragma GCC system_header
#pragma GCC visibility push(default)
... contents of system features.h ...
#pragma GCC visibility pop

GCC whingings, потому что после __extension__ должно следовать выражение, на которое влияет __extension__;он жалуется, что #pragma GCC visibility push(default) не достаточно хорош.

Очевидная вещь, которую нужно сделать, это исправить версию SpiderMonkey features.h, чтобы поместить фиктивную декларацию вверху файла, чтобы GCC был доволен __extension__ декларация.Но, конечно, файл включен несколько раз, поэтому я должен повторить его.

Код компилируется с -std=gnu99 -fno-rtti -fno-exceptions -fno-math-errno -pthread -pipe -g -freorder-blocks -O3 -fomit-frame-pointer

Есть идеи?

1 Ответ

0 голосов
/ 04 декабря 2018

Конечно, объявления без определения могут повторяться.Определения объектов, функций и перечислимых констант не могут (в C).

Нет необходимости также объявлять объект.Можно использовать просто typedef char Unusedtype;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...