问题标签 [storage-class-specifier]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 可以在声明中的什么位置放置存储类说明符?
例如,让我们考虑static
存储类说明符。以下是此存储类说明符的有效和不正确用法的几个示例:
(标记为“有效”的声明被 Visual C++ 2012、g++ 4.7.2 和 Clang++ 3.1 接受。标记为“格式错误”的声明被所有这些编译器拒绝。)
这看起来很奇怪,因为存储类说明符适用于声明的变量。它是声明的变量,而static
不是声明变量的类型。为什么都是e
和i
病态的,却k
是良态的?
管理存储类说明符的有效放置的规则是什么?虽然我static
在此示例中使用过,但该问题适用于所有存储类说明符。完整的答案最好引用 C++11 语言标准的相关部分并进行解释。
c - 声明说明符和声明符
参考问题在声明中可以放置存储类说明符的位置?我开始分析declaration-specifiers
and的概念declarators
。以下是我的理解的积累。
声明
- 通常,
C
声明遵循以下语法declaration-specifiers declarators;
declaration-specifiers
包括type-specifiers
,storage-class-specifiers
和type-qualifiers
declarators
可以是变量、指针、函数和数组等。
我假设的规则
declaration-specifiers
可以按任意顺序指定,例如- 不能超过一个
storage-class-specifier
- 另一方面可以有多个
type-qualifiers
storage-class-specifier
不得与declarator
问题
Q1:在常量指针的声明中,我看到混合declarator
和type-qualifier
如下
Q2:可以有一个指向static int
. 是否有可能为指针提供static
存储类?表示指针是静态的。
c - 类型限定符对存储位置的影响
type-qualifiers
正如标题中提到的,如果影响声明符的存储位置(stack
等) ,我有点困惑bss
。为了描述更多,我正在考虑以下声明。
- 在上面的代码中,默认
storage-class-specifier
是auto
. - 因此,假设这些常量将在创建时
stack-frame
分配。main
- 通常,
pointers
堆栈中的各个内存位置都可以自由修改其中包含的值。 - 因此,从以上几点可以理解,要么
type-qualifier
添加一些逻辑来保留所constant
存储元素的性质(如果是这样,它是什么?),要么constants
存储在read-only-portion
内存中。请详细说明这一点。
更详细的例子
在上面的例子中,两者都cptr
指向ptr
同一个位置。但是cptr
是指向const type qualified
整数的指针。在修改 的值时cptr
,编译器会抛出一个错误为"assignment of read-only location '*cptr'"。但我可以使用 修改相同的位置,ptr
如下面的输出所示。请解释
c - c/c++ 中的 gcc 编译器是否保证将指向 const 数据的全局 const 指针放在单独的只读部分中?
给定以下全局(或静态局部)变量的定义:
,我可以依赖这样一个事实,即初始化列表中的ptr和data都将被放置到生成的目标文件的单独只读部分(即它不会被放置到 .data 或包含非常量变量的类似部分)?
问题仅与所有架构/平台(至少其中存在只读内存的那些)共有的gcc c/c++ 编译器行为有关。它并不意味着任何平台、处理器、操作系统、链接器、启动运行时、库等。
请不要问我要做什么。我知道我在做什么。如果我提供的信息不足以回答,则必须将问题视为特定于 xxx 的问题,通用答案为“否”。我已经阅读了非常接近地提到这个主题的问答:
类型限定符对存储位置的影响
C 中如何实现只读内存?
“const”只是意味着只读还是更多?
为什么编译器允许你在这里“写”一个 const 变量?
GCC C++ (ARM) 和指向结构字段
memcpy 的 const 指针以及指向 const 数据的目标指针
但我没有找到确定和直接的答案。
c - “文件范围”和“程序范围”有什么区别
全局声明的变量被称为具有程序范围
使用静态关键字全局声明的变量被称为具有文件范围。
例如:
这两者有什么区别?
c - C中的_Thread_local存储类说明符?
我在C How to Program 7th一书中读到了一个关于一些新的标准 C 存储类的注释,名为_Thread_local
:
新的 C 标准增加了存储类说明符
_Thread_local
,这超出了本书的范围。
我在谷歌和这里寻找它,但没有出现。有人可以给我一些关于它的链接吗?
c++ - 变量可以同时声明为静态和外部吗?
为什么以下不编译?
但如果你颠倒顺序,它编译得很好。
这里发生了什么?
c - 当我们可以以相同的成本获得全局变量时,静态局部变量有什么用?
在 C 中,当外部变量可以以相同的成本达到其目的时,静态存储类的用途是什么,即。两者都占用可执行文件数据段中的存储空间。
我对外部变量有更好的范围。如果我希望外部变量的范围是特定文件,我不会在其他地方声明这个变量。我看到全局变量比静态局部变量有很大的灵活性
如果我们有变量的地址,我们可以在函数外部引用局部静态变量。局部静态变量的内存将在数据段中,而不是在函数的堆栈帧中。所以静态存储类带来了独特的功能.
我只想知道静态是否有任何我不知道的微妙目的。
c - 为什么使用 File1 中定义的数组在 File2 中工作(仅在此处声明),即使没有“extern”?
这里我有两个文件。在第一个文件中,我在文件范围内声明externdemo1.c
并externdemo2.c
初始化了一个字符数组arr
。但是我在第二个文件中声明了它,externdemo2.c
没有extern
关键字,并在函数中使用它display()
。这是我由此引起的困惑。请回答这三个:
1)为什么即使我在arr
没有extern
关键字 in的情况下声明程序也能正常编译externdemo2.c
?我读过函数的默认链接是外部的,但我不确定变量是否也是如此。我只知道全局变量有extern
存储班级。
2)extern storage class
和之间的严格区别是什么extern linkage
。我非常需要澄清这一点。在第一个文件中,我定义了数组arr
,我没有使用关键字extern
,但我知道它默认有extern storage
类。但是在第二个文件,是不是有任何默认extern
的,存储类或链接,关于全局变量arr
,即在externdemo2.c
?
3)检查第一个文件中注释掉的行。只是externdemo1.c
为了测试它,我使用了该行extern char arr[3]={'3','4','7'};
。但是它给出了错误。'arr' initialized and declared 'extern'
这个错误是什么意思?我还提到了一个注释行extern int main()
,但它工作正常,没有错误或警告。那么为什么我们可以使用extern
一个函数,即使一个函数是extern
默认的,而不是一个变量,就像arr
这里?
请花一些时间来帮我解决这个问题。它会清除我对整个事情的大部分挥之不去的疑虑。如果你能回答所有 3 位1)、2) 和 3),extern
这将是巨大的帮助。Especially 3) is eating my brains out
c - 多个文件中的外部和可能的双重定义
我正在运行以下一起编译的代码:gcc A.c B.c -o combined
方案一:
方案 B:
在运行“组合”程序时,输出为:
现在,我对这个有一些疑问:
为什么没有输出:
0 2
1 0
a 和 b 不是定义了两次吗?
请清楚地解释这些,我在理解 extern 时遇到了很多问题,而且这些疑问很少不时出现。
提前致谢。