c++ - C/GCC 中可重复的全局声明

标签 c++ c gcc

简短版本:C(和 C++,用 GCC 6.4 编译)中是否有一种方法可以在翻译单元内重复声明全局变量?

长版:我到底为什么要这么做?嗯:

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

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++ 标准库 #includestdlib.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 可见性推送(默认) 不够好。

显而易见的事情是修补 SpiderMonkey 的 features.h 版本,在文件顶部放置一个虚拟声明,以使 GCC 满意 __extension__ 声明。但当然该文件被重复包含,因此它需要是我可以重复的东西。

正在使用-std=gnu99 -fno-rtti -fno-exceptions -fno-math-errno -pthread -pipe -g -freorder-blocks -O3 -fomit-frame-pointer 编译代码

有什么想法吗?

最佳答案

当然,非定义声明是可​​以重复的。对象、函数和枚举常量的定义不能(在 C 中)。

也无需声明对象。人们可以简单地使用typedef char Unusedtype;

关于c++ - C/GCC 中可重复的全局声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53615000/

相关文章:

C++ 重载相等运算符。我应该编写我的函数来接受通过引用或值传递的参数吗?

c++ - 为什么我的初始化列表对于类型推导是半忽略的?

c++ - 我想学习win32编程

c - 将字符串拆分为C中的单词数组

c - C结构如何传递给汇编函数?

c++ - 找不到入口点

c - 使用 getchar 遍历用户输入

arrays - 删除小于数组左侧元素的元素

c - 试图从 linux 内核理解一段内联臂程序集

c - Scanf 在 C 中跳过每隔一个 while 循环