在C / GCC中可重复的全局声明

时间:2018-12-04 14:21:35

标签: c++ c gcc

简短版本:C(和C ++,使用GCC 6.4编译)中是否有办法在转换单元中重复声明全局变量?

长版:为什么我要这么做?好吧:

我正在尝试在ARMv6的Alpine Linux上构建CouchDB。该平台(AFAICT)没有预构建的CouchDB软件包。

CouchDB取决于SpiderMonkey / mozjs(Mozilla javascript引擎)。此平台AFAICT没有预构建的mozjs软件包(请注意,在所有非ARM平台上都有 用于Alpine的预构建mozjs软件包)。

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发出嗡嗡声,因为必须在__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 :(得分:1)

当然可以重复非定义声明。对象,函数和枚举常量的定义不能(用C语言表示)。

也无需声明对象。一个人可能只使用typedef char Unusedtype;