我对以下代码感到困惑:
#include <iostream>
using namespace std;
int *foo()
{
//Operation
}
int main ()
{
auto int ret = foo();
}
Run Code Online (Sandbox Code Playgroud)
我在GCC下编译了上面的代码,但是我收到了以下错误:
error: two or more data types in declaration of 'ret'
auto int ret = foo();
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除int类型,如下:
auto ret = foo();
Run Code Online (Sandbox Code Playgroud)
然后它成功运行.
auto是一个存储类,int是一种数据类型,那么为什么我在第一种情况下得到"两种或更多数据类型"的错误?
全局声明的变量被称为具有程序范围
使用static关键字全局声明的变量据说具有文件范围.
例如:
int x = 0; // **program scope**
static int y = 0; // **file scope**
static float z = 0.0; // **file scope**
int main()
{
int i; /* block scope */
/* .
.
.
*/
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别?
为什么以下不编译?
...
extern int i;
static int i;
...
Run Code Online (Sandbox Code Playgroud)
但如果你颠倒了订单,那就很好.
...
static int i;
extern int i;
...
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
例如,让我们考虑一下static存储类说明符.以下是此存储类说明符的有效和不正确用法的几个示例:
static int a; // valid
int static b; // valid
static int* c; // valid
int static* d; // valid
int* static e; // ill-formed
static int const* f; // valid
int static const* g; // valid
int const static* h; // valid
int const* static i; // ill-formed
typedef int* pointer;
static pointer j; // valid
pointer static k; // valid
Run Code Online (Sandbox Code Playgroud)
(标记为"有效"的声明被Visual C++ 2012,g ++ 4.7.2和Clang ++ 3.1接受.标记为"格式错误"的声明被所有这些编译器拒绝.)
这看起来很奇怪,因为存储类说明符适用于声明的变量.它是声明的变量,而static不是声明的变量的类型.为什么e和i形象k …
typedef说明符的语法:
typedef <existing_name> <alias_name>
Run Code Online (Sandbox Code Playgroud)
例如:
typedef long unsigned int Int;
Run Code Online (Sandbox Code Playgroud)
它工作正常.
但是,如果我typedef在宣言中的任何地方放置,像这样:
long unsigned typedef int Int;
Run Code Online (Sandbox Code Playgroud)
然后,它也工作正常.
为什么?我们typedef可以在宣言中放置任何地方吗?
当说明mutable符用于非静态数据成员的声明时,无论对象的其余部分是否被视为const,数据都是可变的.有了这个事实,我们可能很容易产生这样的印象:mutable说明符与限定符是同一类const,事实证明这不是真的.实际上,该语言将mutable说明符分类为存储类说明符.这非常违反直觉,因为mutable它没有指定存储持续时间.
这个设计决定背后的理由是什么?
什么会使它不像它似乎mutable是一个限定符?
使其成为存储类说明符有什么好处?
c++ language-design mutable language-lawyer storage-class-specifier
可在auto关键字被用作在C++ 11中的存储类说明?
以下代码在C++ 11中是否合法?
int main() {
auto int x;
}
Run Code Online (Sandbox Code Playgroud) 我正在运行以下代码编译为: gcc A.c B.c -o combined
计划A:
#include<stdio.h>
int a=1;
int b;
int main()
{
extern int a,b;
fun();
printf("%d %d\n",a,b);
}
Run Code Online (Sandbox Code Playgroud)
方案B:
int a;
int b=2;
int fun()
{
printf("%d %d\n",a,b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在运行"组合"程序时,输出为:
1 2
1 2
Run Code Online (Sandbox Code Playgroud)
现在,我对这个问题有些疑惑:
为什么不输出:
0 2
1 0
是不是a和b定义了两次?
请清楚地解释一下,我在了解外部时遇到了很多问题,而且很少有这些疑虑不时出现.
提前致谢.
我惊讶地发现这段代码编译:
pure string Foo = SomePureFunction(123);
Run Code Online (Sandbox Code Playgroud)
pure仅在在线文档中的功能上下文中提及.
什么是pure变量,以及他们如何从不同的immutable和const的呢?
在C中,当外部变量以相同的成本服务于其目的时,静态存储类的用途是什么.两者都占用了可执行文件数据段中的存储空间.
我有更好的外部变量范围.如果我希望外部变量的范围是特定文件我不要声明这个变量else where.i看到很多灵活性与全局变量静态局部变量
如果我们有变量的地址,我们可以引用函数外部的局部静态变量.本地静态变量的存储将在数据段中不在函数的堆栈框架中.所以静态存储类带来的独特特性表.
我只是想知道静态是否有任何我不知道的微妙目的.