问题标签 [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.

0 投票
3 回答
3977 浏览

c++ - 可以在声明中的什么位置放置存储类说明符?

例如,让我们考虑static存储类说明符。以下是此存储类说明符的有效和不正确用法的几个示例:

(标记为“有效”的声明被 Visual C++ 2012、g++ 4.7.2 和 Clang++ 3.1 接受。标记为“格式错误”的声明被所有这些编译器拒绝。)

这看起来很奇怪,因为存储类说明符适用于声明的变量。它是声明的变量,而static不是声明变量的类型。为什么都是ei病态的,却k是良态的?

管理存储类说明符的有效放置的规则是什么?虽然我static在此示例中使用过,但该问题适用于所有存储类说明符。完整的答案最好引用 C++11 语言标准的相关部分并进行解释。

0 投票
3 回答
12028 浏览

c - 声明说明符和声明符

参考问题在声明中可以放置存储类说明符的位置?我开始分析declaration-specifiersand的概念declarators。以下是我的理解的积累。

声明

  • 通常,C声明遵循以下语法declaration-specifiers declarators;
  • declaration-specifiers包括type-specifiers,storage-class-specifierstype-qualifiers
  • declarators可以是变量、指针、函数和数组等。

我假设的规则

  • declaration-specifiers可以按任意顺序指定,例如
  • 不能超过一个storage-class-specifier
  • 另一方面可以有多个type-qualifiers
  • storage-class-specifier不得与declarator

问题

Q1:在常量指针的声明中,我看到混合declaratortype-qualifier如下

Q2:可以有一个指向static int. 是否有可能为指针提供static存储类?表示指针是静态的。

0 投票
2 回答
113 浏览

c - 类型限定符对存储位置的影响

type-qualifiers正如标题中提到的,如果影响声明符的存储位置(stack等) ,我有点困惑bss。为了描述更多,我正在考虑以下声明。

  • 在上面的代码中,默认storage-class-specifierauto.
  • 因此,假设这些常量将在创建时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如下面的输出所示。请解释

0 投票
1 回答
623 浏览

c - c/c++ 中的 gcc 编译器是否保证将指向 const 数据的全局 const 指针放在单独的只读部分中?

给定以下全局(或静态局部)变量的定义:

,我可以依赖这样一个事实,即初始化列表中的ptrdata都将被放置到生成的目标文件的单独只读部分(即它不会被放置到 .data 或包含非常量变量的类似部分)?

问题仅与所有架构/平台(至少其中存在只读内存的那些)共有的gcc c/c++ 编译器行为有关。它并不意味着任何平台、处理器、操作系统、链接器、启动运行时、库等。

请不要问我要做什么。我知道我在做什么。如果我提供的信息不足以回答,则必须将问题视为特定于 xxx 的问题,通用答案为“否”。我已经阅读了非常接近地提到这个主题的问答:

类型限定符对存储位置的影响
C 中如何实现只读内存?
“const”只是意味着只读还是更多?
为什么编译器允许你在这里“写”一个 const 变量?
GCC C++ (ARM) 和指向结构字段
memcpy 的 const 指针以及指向 const 数据的目标指针

但我没有找到确定和直接的答案。

0 投票
4 回答
24174 浏览

c - “文件范围”和“程序范围”有什么区别

全局声明的变量被称为具有程序范围
使用静态关键字全局声明的变量被称为具有文件范围。

例如:

这两者有什么区别?

0 投票
1 回答
3455 浏览

c - C中的_Thread_local存储类说明符?

我在C How to Program 7th一书中读到了一个关于一些新的标准 C 存储类的注释,名为_Thread_local

新的 C 标准增加了存储类说明符_Thread_local,这超出了本书的范围。

我在谷歌和这里寻找它,但没有出现。有人可以给我一些关于它的链接吗?

0 投票
4 回答
9604 浏览

c++ - 变量可以同时声明为静态和外部吗?

为什么以下不编译?

但如果你颠倒顺序,它编译得很好。

这里发生了什么?

0 投票
6 回答
28763 浏览

c - 当我们可以以相同的成本获得全局变量时,静态局部变量有什么用?

在 C 中,当外部变量可以以相同的成本达到其目的时,静态存储类的用途是什么,即。两者都占用可执行文件数据段中的存储空间。

我对外部变量有更好的范围。如果我希望外部变量的范围是特定文件,我不会在其他地方声明这个变量。我看到全局变量比静态局部变量有很大的灵活性

如果我们有变量的地址,我们可以在函数外部引用局部静态变量。局部静态变量的内存将在数据段中,而不是在函数的堆栈帧中。所以静态存储类带来了独特的功能.

我只想知道静态是否有任何我不知道的微妙目的。

0 投票
3 回答
198 浏览

c - 为什么使用 File1 中定义的数组在 File2 中工作(仅在此处声明),即使没有“extern”?

这里我有两个文件。在第一个文件中,我在文件范围内声明externdemo1.cexterndemo2.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

0 投票
4 回答
4192 浏览

c - 多个文件中的外部和可能的双重定义

我正在运行以下一起编译的代码:gcc A.c B.c -o combined

方案一:

方案 B:

在运行“组合”程序时,输出为:

现在,我对这个有一些疑问:

  1. 为什么没有输出:

    0 2

    1 0

  2. a 和 b 不是定义了两次吗?

请清楚地解释这些,我在理解 extern 时遇到了很多问题,而且这些疑问很少不时出现。

提前致谢。