我在一本书中读到,每当我们用存储类声明一个变量作为寄存器时,它就会被存储在寄存器中,具体取决于它的可用性.如果没有可用的寄存器,则将为其分配默认存储类型"auto".
每当我们在没有明确提及任何存储类的情况下声明变量时,分配给它的默认存储类型本身就是"auto".
所以,我的问题是,为什么不将每个变量声明为'register'存储类 - 如果没有可用的寄存器,它将被视为默认的'auto'类本身.幸运的是,如果寄存器可用,那么它将存储在一个寄存器中.我知道我们不能再使用&运算符,但是如果我不打算使用指针和地址呢?我可以使用'register'存储类声明这些变量吗?因为这似乎是一种不好的做法.
编辑:我在网上搜索,但"地址不可用"是唯一提到的点.为什么不能使用'register'声明其余变量.
我读到gcc提供了将全局变量定义为寄存器存储变量的支持.我想知道的是标准是否有这种支持的任何规范.
以下列方式定义变量时:
static register int a1 = 0;
Run Code Online (Sandbox Code Playgroud)
我们得到错误:
error: multiple storage classes in declaration specifiers
Run Code Online (Sandbox Code Playgroud)
这个错误有什么根本原因吗?为什么变量既不能存储在寄存器中,也只能在启动/第一次调用时初始化?可以将寄存器存储类附加到全局变量.< - 编辑:不是真的
我是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) 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
天真的人可能认为它有,因为通常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++标准的第7.1节提到'extern'是一个存储类说明符.
N3126 - "extern说明符只能应用于变量和函数的名称.extern说明符不能用于类成员或函数参数的声明.对于使用extern说明符声明的名称的链接,请参见3.5.[注意:extern关键字也可以用于显式实例化和链接规范,但它不是这种上下文中的存储类说明符.-end note]
我理解这个关键字,它在'链接规范'的上下文中使用,但我无法掌握'extern'作为存储说明符的用法.
我试图编译一些代码但是我收到错误
storage class specified for 'FileCase'
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思?
这是否与我在头文件的私有部分将其声明为 extern int 的事实有关?
我无法解决这个问题。在 cpp 文件中,我已将其声明为
int FileCase =0;
Run Code Online (Sandbox Code Playgroud)
在需要它的函数内部,但是它不能解决问题。有谁知道可能是什么问题?
谢谢
吉斯
在C,(GCC编译器)中,全局变量的默认存储类是什么?
让我分享一个代码,例如:
int i;
void f()
{ --statements--}
main()
{ --- set of statements--- }
Run Code Online (Sandbox Code Playgroud)
如果我说变量i是静态的而不是外部的,我是否正确?
在 C++ 中,该关键字register已在其最新标准 ISO/IEC 14882:2017 (C++17) 中删除。
但也在 C 中,我看到很多,越来越多的编码人员倾向于不使用或不喜欢用register类限定符声明一个对象,因为它的预期好处几乎没有用,就像@user253751 的回答一样:
register不会导致编译器在寄存器中存储值。register什么都不做。只有非常古老的编译器register才知道将哪些变量存储在寄存器中。新的编译器会自动完成。即使是 20 岁的编译器也会自动完成。
是否使用register类变量以及register不推荐使用关键字?
我应该register在现代程序中使用类变量吗?还是这种行为是多余的和已弃用的?
c ×7
c++ ×3
extern ×3
compilation ×1
const ×1
d ×1
gcc ×1
immutability ×1
scope ×1
variables ×1