局部变量和寄存器变量可以声明为 extern 吗?

2024-03-13

我一直想知道是否可以在本地声明 extern 和寄存器变量。如果可以的话,会受到什么限制?


在某些情况下,局部变量可以声明为 extern

让我们来读一下C99 N1256标准草案 http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf.

该标准将“局部变量”称为具有“块作用域”。

6.7.1/5“存储类说明符”说:

具有块作用域的函数的标识符声明不应具有除 extern 之外的显式存储类说明符。

那么添加意味着什么extern对于局部变量,6.2.2/4“标识符的链接”说:

对于在该标识符的先前声明可见的范围内使用存储类说明符 extern 声明的标识符,如果先前的声明指定内部或外部链接,则后面声明处的标识符的链接与该链接相同在事先声明中指定。如果没有可见的先前声明,或者如果先前声明未指定链接,则该标识符具有外部链接。

让我们来分解一下这些案例。

没有事先声明

void f() {
    extern int i;
}

是相同的:

extern int i;
void f() {}

除了该声明仅在内部可见f.

这是因为i没有可见的事先声明。所以i具有外部链接(与全局变量相同的链接)。

事先声明未指定任何联系

int i;
void f() {
    extern int i;
}

是相同的:

void f() {
    extern int i;
}

因为事先声明int i没有指定任何链接,因为第 6 段说:

以下标识符没有链接:声明为对象或函数以外的任何标识符;声明为函数参数的标识符;未使用存储类说明符 extern 声明的对象的块作用域标识符。

事先声明指定内部或外部链接

extern int i;
void f() {
    extern int i;
}

是相同的:

extern int i;
void f() {}

and:

static int i;
void f() {
    extern int i;
}

是相同的:

static int i;
void f() {}

因为在这两种情况下我们都有先前可见的外部和内部(static) 分别链接声明。

初始化本地外部

无效C:

void f() {
    extern int i = 0;
}

因为块作用域声明有一个初始化。

Valid C:

extern int i = 0;
void f() {}

但可以说是糟糕的风格,因为相当于较短的:

int i = 0;
void f() {}

因为 6.7.8 初始化说:

如果标识符的声明具有块作用域,并且标识符具有外部或内部链接,则声明不应具有标识符的初始值设定项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

局部变量和寄存器变量可以声明为 extern 吗? 的相关文章

随机推荐

  • 为什么在使用空引用访问静态时不会出现 NullPointerException? [复制]

    这个问题在这里已经有答案了 在下面的代码中我们得到的值i在空引用上 尽管NPE不在这里 public class Test static int i 10 Test getTest return null public static voi
  • 安装新版本 XCode 15.0 后无法运行应用程序 XCode

    我已经安装了新版本的 Xcode 15 0 此后我无法运行我的 flutter 应用程序 它向我显示以下错误 Error Xcode DT TOOLCHAIN DIR cannot be used to evaluate LIBRARY S
  • 如何矢量化在较大矩阵的子集上运行函数的代码?

    假设我有以下 9 x 5 矩阵 myArray 54 7 8 1 81 7 55 0 22 5 29 6 92 9 79 4 62 2 17 0 74 4 77 5 64 4 58 7 22 7 18 8 48 6 37 8 20 7 43
  • C 中的释放字符串

    如果我写 char a malloc sizeof char 4 a abc char b abc 我是否需要释放该内存 还是由我的系统完成 在您的情况下 您将无法释放动态分配的内存 因为您正在丢失对它的引用 试试这个 include
  • 通过 Android 共享时 Google+ 应用程序显示错误的图片

    我已以编程方式将 Google 共享添加到我的应用程序中 我有一组照片 我将其包含在我的帖子中并使用以下代码共享 private void shareToGooglePlus Launch the Google share dialog w
  • Python-UDP客户端

    我目前正在阅读Pythonbook https www nostarch com blackhatpython并遇到了以下示例 import socket target host 127 0 0 1 target port 80 creat
  • LD_PRELOAD __libc_start_main 的 Makefile

    我想做的事情很简单 当我启动猫鼬服务器时 我想创建一个额外的线程来完成一些额外的工作 为了做到这一点 我想我需要LD PRELOAD the libc start main服务器的 This is spec hooks cpp typede
  • 与邮递员的 CORS

    这个问题已经被问过几次了 但我还是不明白 当我读到有关的答案时 没有 Access Control Allow Origin 标头 问题 它说应该在请求的服务器上设置一个设置以允许跨域 add header Access Control A
  • 适用于 Windows 的 Composer 安装 -

    所以我尝试在我的 Windows 操作系统上安装 Composer 并设置 Laravel 但是当我运行安装时 我不断收到相同的错误 首先 我选择了 php exe 因为它从目录中询问C wamp bin php php5 4 16 我单击
  • JIT 编译的代码驻留在哪里?

    所以我有这个方法 用Java编写 public void myMethod int y int x 5 y doSomething x 并假设我的应用程序多次调用此函数 当在Java虚拟机上运行该方法的编译代码时 JVM将首先解释该方法 然
  • 如何使用 IF EXIST 条件检查目录或文件是否存在?

    如何检查目录或文件是否存在IF EXIST健康 状况 Such as If exist C Windows OR C Windows2 rem Do something else rem Something else 我该怎么做 简单例子1
  • 应该在带花括号的 return 语句中调用哪个构造函数?

    考虑以下代码 struct NonMovable NonMovable default NonMovable const NonMovable default NonMovable NonMovable delete NonMovable
  • 调度程序 BeginInvoke 语法

    我一直在尝试遵循一些 WCF 数据服务示例并具有以下代码 private void OnSaveCompleted IAsyncResult result Dispatcher BeginInvoke gt context EndSaveC

  • 元素可以有结束标签吗?

    我的同事并不真正了解或理解 html 她的工作是向 CMS 输入信息 我注意到她一直关闭她 hr 像这样的标签 hr 我有谷歌 但我找不到任何地方说这是不允许的或可能会导致问题 我知道它应该是 hr 但值得我告诉她还是这是不必要但有效的标记
  • Apollo重新获取不重新渲染组件

    我正在使用 graphql 从网络服务获取数据 我的客户端代码是这样的 import React Component from react import Platform StyleSheet Text ActivityIndicator
  • React - 加载外部脚本的问题

    我正在从事我的第一个 React 项目 并且对 JS 有点陌生 我正在努力解决一个非常基本的问题 我想知道调试这个的最佳实践是什么 我确实创建了我的应用程序create react app我没有成功加载外部脚本 令人惊讶的是 到目前为止 我
  • Aiohttp、Asyncio:运行时错误:事件循环已关闭

    我有两个脚本 scraper py 和 db control py 在 scraper py 我有这样的东西 def scrape category field pages search use proxy proxy file loop
  • JavaScript YUI3 使用全局变量?

    我不知道如何从 YUI3 中更新全局变量 考虑以下代码 window myVariable data one var yuiWrap YUI use node function Y console log window myVariable
  • Spring - 如何正确使用@Autowired来防止controller / MockMvc为空?

    我正在尝试运行一些单元测试并遇到一个问题 我确信该问题源于对自动装配的误解 我有一个单元测试类 我正在尝试使用 Autowired在 MockMvc 和 REST 控制器上 两者最终都为 null 我看到一些消息来源试图解释为什么会发生这种
  • 局部变量和寄存器变量可以声明为 extern 吗?

    我一直想知道是否可以在本地声明 extern 和寄存器变量 如果可以的话 会受到什么限制 在某些情况下 局部变量可以声明为 extern 让我们来读一下C99 N1256标准草案 http www open std org JTC1 SC2