标签: storage-class-specifier

为什么我们不能总是在C中使用寄存器存储类?

我在一本书中读到,每当我们用存储类声明一个变量作为寄存器时,它就会被存储在寄存器中,具体取决于它的可用性.如果没有可用的寄存器,则将为其分配默认存储类型"auto".

每当我们在没有明确提及任何存储类的情况下声明变量时,分配给它的默认存储类型本身就是"auto".

所以,我的问题是,为什么不将每个变量声明为'register'存储类 - 如果没有可用的寄存器,它将被视为默认的'auto'类本身.幸运的是,如果寄存器可用,那么它将存储在一个寄存器中.我知道我们不能再使用&运算符,但是如果我打算使用指针和地址呢?我可以使用'register'存储类声明这些变量吗?因为这似乎是一种不好的做法.

编辑:我在网上搜索,但"地址不可用"是唯一提到的点.为什么不能使用'register'声明其余变量.

c c++ storage-class-specifier

3
推荐指数
1
解决办法
1487
查看次数

C语言标准是否指定了对全局寄存器变量的支持

我读到gcc提供了将全局变量定义为寄存器存储变量的支持.我想知道的是标准是否有这种支持的任何规范.

c global-variables storage-class-specifier register-keyword

3
推荐指数
1
解决办法
329
查看次数

为什么不能一起使用静态和寄存器存储类?

以下列方式定义变量时:

static register int a1 = 0;
Run Code Online (Sandbox Code Playgroud)

我们得到错误:

error: multiple storage classes in declaration specifiers
Run Code Online (Sandbox Code Playgroud)

这个错误有什么根本原因吗?为什么变量既不能存储在寄存器中,也只能在启动/第一次调用时初始化?可以将寄存器存储类附加到全局变量.< - 编辑:不是真的

c compilation storage-class-specifier

3
推荐指数
2
解决办法
884
查看次数

为什么我需要声明这个函数extern.它没有它

我是extern概念的新手.今天在工作中我遇到了大量在头文件中声明的外部函数; foo.h. 在一堆乱七八糟的文件夹中,我发现了一个foo.c文件,其中包含所述函数的定义但却没有#include foo.h.当我回到家时,我决定使用extern存储类示例.在"C书"中做了一些阅读之后,这就是我想出来的.

这是我不希望工作的东西.但确实如此.

main.c中

#include <stdio.h> 

int data;

int main()
{

  data = 6;

  printf("%d\n", getData());

  data = 8;

  printf("%d\n", getData());
  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

externs.c

int getData()
{
  extern int data;
  return data;
}
Run Code Online (Sandbox Code Playgroud)

庆典

gcc main.c externs.c -o externs
Run Code Online (Sandbox Code Playgroud)

我不认为这会起作用,因为在main之前,函数在技术上(或至少是详细的)没有定义.这是否有效,因为默认存储类int getData()extern?如果是这样,为什么甚至打扰下面的例子(类似于我在工作中看到的)?

main2.c

#include <stdio.h> 
#include "externs.h"

int data;

int main()
{

  data = 6;

  printf("%d\n", getData());

  data = 8;

  printf("%d\n", getData());
  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

externs.h

#ifndef _EXTERNSH_
#define _EXTERNSH_

extern int …
Run Code Online (Sandbox Code Playgroud)

c scope extern storage-class-specifier

3
推荐指数
1
解决办法
105
查看次数

不可变和const成员函数有什么区别?

D编程语言参考在声明类型限定符部分中显示了两个示例,因此这些都是可能的:

struct S
{
    int method() const
    {
        //const stuff
    }
}

struct S
{
    int method() immutable
    {
        //immutable stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

来自文档:

Const成员函数是不允许通过成员函数的this引用更改对象的任何部分的函数.

和:

不可变成员函数保证该引用引用的对象和任何内容是不可变的.

我发现了这个问题,但所有的答案都是关于数据类型,而不是存储类.这同样适用于d const的常见问题,即使它是一个有趣的阅读.

那么上面两个定义之间的区别是什么?是否有表达可以取代//const stuff并且合法但不是//immutable stuff

d const member-functions immutability storage-class-specifier

3
推荐指数
1
解决办法
99
查看次数

每个变量在C中都有一个存储类吗?

天真的人可能认为它有,因为通常auto假设没有提供存储类关键字.

但是,对于放在auto它们前面的文件范围变量会产生错误.

#include <stdio.h>

auto int x;

int main(void){
  x = 7;
  printf("x = %d", x);
}
Run Code Online (Sandbox Code Playgroud)

Clang抱怨说:

3:10: error: illegal storage class on file-scoped variable
auto int x;
Run Code Online (Sandbox Code Playgroud)

声明x没有任何存储类关键字,它编译:

#include <stdio.h>

int x;

int main(void){
  x = 7;
  printf("x = %d", x);
}
Run Code Online (Sandbox Code Playgroud)

现在我想知道x上面的例子中存储类有什么?它有名字吗?

c storage-class-specifier

3
推荐指数
2
解决办法
158
查看次数

外部存储类说明符

C++标准的第7.1节提到'extern'是一个存储类说明符.

N3126 - "extern说明符只能应用于变量和函数的名称.extern说明符不能用于类成员或函数参数的声明.对于使用extern说明符声明的名称的链接,请参见3.5.[注意:extern关键字也可以用于显式实例化和链接规范,但它不是这种上下文中的存储类说明符.-end note]

我理解这个关键字,它在'链接规范'的上下文中使用,但我无法掌握'extern'作为存储说明符的用法.

  1. 所有'extern'名称都不具有静态存储持续时间吗?
  2. 如果对1的答案是肯定的,那为什么会出现这种冗余?C兼容性?

c++ extern storage-class-specifier

2
推荐指数
1
解决办法
5561
查看次数

为“FileCase”错误指定的存储类

我试图编译一些代码但是我收到错误

  storage class specified for 'FileCase'
Run Code Online (Sandbox Code Playgroud)

这个错误是什么意思?

这是否与我在头文件的私有部分将其声明为 extern int 的事实有关?

我无法解决这个问题。在 cpp 文件中,我已将其声明为

  int FileCase =0; 
Run Code Online (Sandbox Code Playgroud)

在需要它的函数内部,但是它不能解决问题。有谁知道可能是什么问题?

谢谢

吉斯

c++ global-variables extern storage-class-specifier

2
推荐指数
1
解决办法
9547
查看次数

存储类默认全局变量(gcc编译器)?

在C,(GCC编译器)中,全局变量的默认存储类是什么?

让我分享一个代码,例如:

int i; 

void f()
{ --statements--}

main()
{ --- set of statements--- }
Run Code Online (Sandbox Code Playgroud)

如果我说变量i是静态的而不是外部的,我是否正确?

c variables gcc storage-class-specifier

1
推荐指数
1
解决办法
182
查看次数

我应该在现代 C 程序中使用寄存器类变量吗?

在 C++ 中,该关键字register已在其最新标准 ISO/IEC 14882:2017 (C++17) 中删除。

但也在 C 中,我看到很多,越来越多的编码人员倾向于不使用或不喜欢用register类限定符声明一个对象,因为它的预期好处几乎没有用,就像@user253751 的回答一样

register不会导致编译器在寄存器中存储值。register什么都不做。只有非常古老的编译器register才知道将哪些变量存储在寄存器中。新的编译器会自动完成。即使是 20 岁的编译器也会自动完成。

  • 是否使用register类变量以及register不推荐使用关键字?

  • 我应该register在现代程序中使用类变量吗?还是这种行为是多余的和已弃用的?

c cpu-registers storage-class-specifier

1
推荐指数
1
解决办法
138
查看次数