简短版本: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
有什么想法吗?
答案 0 :(得分:1)
当然可以重复非定义声明。对象,函数和枚举常量的定义不能(用C语言表示)。
也无需声明对象。一个人可能只使用typedef char Unusedtype;
。