标签: declaration

C++全局变量初始化顺序

我不明白以下代码示例的作用以及它是如何做到的:

#include <stdio.h>

int f();

int a = f(); // a exists just to call f

int x = 22;

int f() {
    ++x;
    return 123; // unimportant arbitrary number
}

int main() {
    printf("%d\n", x);
}
Run Code Online (Sandbox Code Playgroud)

当它运行时它打印23,这是直观的答案.

但是在C++中,全局变量应该按照定义的顺序进行初始化.这意味着a之前应该初始化x,因为它是之前定义的x.如果是这种情况,则f必须在x初始化之前调用该函数,因为调用fa定义的一部分.

如果fx初始化之前确实被调用,那将意味着f会尝试增加x- 我不确定的结果(很可能是UB,或者某些乱码值).然后,在a初始化之后,x将初始化为22并且程序将打印出来22.

显然,这不是发生的事情.但是什么呢?该代码实际上做了什么?

它似乎x …

c++ variables initialization declaration definition

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

我什么时候定义objective-c方法?

我正在学习Objective-C,并且拥有C/C++背景.

  • 在面向对象的C++中,总是需要在定义(实现)它之前声明方法,即使它是在父类中声明的.

  • 在过程式C,IIRC中,只要定义一个函数,只要从同一个编译单元中的其他东西(即同一个文件)调用它就可以远离文件中的某个函数(嗯,提供)你没有在其他地方用"extern"声明它.

  • 现在,在Objective-C中,您似乎只需要在头文件中声明选择器,如果它们将被外部使用,并且您可以在.m文件中组合选择器就好了,并在其中调用它们.m文件.此外,似乎永远不会(重新)定义委托方法或继承的方法.

我是在正确的轨道上吗?什么时候需要在Objective-C中定义一个选择器?

api-design declaration definition objective-c

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

我可以在哪里合法地声明C99中的变量?

当我第一次被介绍到CI被告知总是在函数的顶部声明我的变量.现在我对语言有了很强的把握,我将重点放在编码风格上,特别是限制了变量的范围.我已经阅读了限制范围的好处,我遇到了一个有趣的例子.显然,C99允许你这样做......

for (int i = 0; i < 10; i++)
{
   puts("hello");
}
Run Code Online (Sandbox Code Playgroud)

我原以为一个变量的作用域是由最内层的限制周围的花括号{ },但在上面的例子中int i出现通过的,即使是他们的之外声明for循环的花括号中范围有限.

我试图扩展上面的例子fgets()来做我认为类似的东西,但这两个都给了我一个语法错误.

fgets(char fpath[80], 80, stdin);*见说明**

fgets(char* fpath = malloc(80), 80, stdin);

那么,在C99中声明变量的确切位置是合法的吗?for循环示例是规则的例外吗?这适用于whiledo while循环吗?

*注意**:我甚至不确定这在语法上是否正确,即使我可以在那里声明char数组,因为fgets()它正在寻找指向char的指针而不是指向char 数组80的指针.这就是我尝试该malloc()版本的原因.

c variables declaration

34
推荐指数
2
解决办法
7611
查看次数

用C++转发lambda的声明

在C++中,可以分离函数的声明和定义.例如,声明一个函数是很正常的:

int Foo(int x);
Run Code Online (Sandbox Code Playgroud)

Foo.h贯彻它Foo.cpp.是否有可能与lambdas做类似的事情?例如,定义一个

std::function<int(int)> bar;
Run Code Online (Sandbox Code Playgroud)

在以下内容中bar.h实现它bar.cpp:

std::function<int(int)> bar = [](int n)
{
    if (n >= 5) 
        return n;
    return n*(n + 1);
};
Run Code Online (Sandbox Code Playgroud)

免责声明:我在C#中有使用lambdas的经验,但我没有在C++中使用过它们.

c++ lambda declaration definition c++11

34
推荐指数
3
解决办法
4813
查看次数

C中允许重新定义,但C++中不允许重新定义?

为什么这段代码在C中工作但在C++中不工作?

int i = 5;
int i; // but if I write int i = 5; again I get error in C also

int main(){

  // using i
}
Run Code Online (Sandbox Code Playgroud)

c c++ declaration

33
推荐指数
2
解决办法
1539
查看次数

空变量在php中定义

在使用$ error做某事之前:

$error = NULL;
Run Code Online (Sandbox Code Playgroud)

在某些剧本中看到:

$error = '';
$error = false;
$error = 0;
Run Code Online (Sandbox Code Playgroud)
  • 哪种方法"更好"或者可能取决于我使用它的情况?
  • 你的建议是什么?

php variables declaration

33
推荐指数
3
解决办法
4万
查看次数

拆分声明和转让=良好做法?

作为NetBeans的狂热用户,我在引入新变量时不断获得拆分变量声明和赋值的建议.作为一个超级快速的例子,让我们采用这个Java系列:

String someInput = JOptionPane.showInputDialog(null, "- Enter something: "); 
Run Code Online (Sandbox Code Playgroud)

与:

String someInput;
someInput = JOptionPane.showInputDialog(null, "- Enter something: "); 
Run Code Online (Sandbox Code Playgroud)

NetBeans似乎更喜欢后者(但我不知道其他IDE).虽然它显然有两种方式,但如果有的话,这将被视为"良好做法"?或者纯粹是个人喜好?

(显然,拆分这两个意味着你可以只合并为一个额外的一条线,但那就是重点.)

java variables declaration variable-assignment

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

我如何理解复杂的函数声明?

我如何理解以下复杂的声明?

char (*(*f())[])();

char (*(*X[3])())[5];

void (*f)(int,void (*)()); 

char far *far *ptr;

typedef void (*pfun)(int,float);

int **(*f)(int**,int**(*)(int **,int **));
Run Code Online (Sandbox Code Playgroud)

c pointers declaration

32
推荐指数
5
解决办法
5696
查看次数

获取错误:ISO C++禁止声明无类型

我收到以下错误:

ISO C++禁止声明ttTreeInsert没有类型

ISO C++禁止在没有类型的情况下声明ttTreeDelete

ISO C++禁止在没有类型的情况下声明ttTreePrint

int ttTree的原型:: ttTreePrint()与类ttTree中的任何一个都不匹配

候选人是:void ttTree :: ttTreePrint()

这是我的头文件:

#ifndef ttTree_h
#define ttTree_h

class ttTree 
{
public:
  ttTree(void);
  int ttTreeInsert(int value);
  int ttTreeDelete(int value);
  void ttTreePrint(void);

};

#endif
Run Code Online (Sandbox Code Playgroud)

这是我的.cpp文件:

#include "ttTree.h"

ttTree::ttTree(void)
{

}

ttTree::ttTreeInsert(int value)
{
}

ttTree::ttTreeDelete(int value)
{
}

ttTree::ttTreePrint(void)
{
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出导致这些错误的原因吗?谢谢!

c++ constructor class declaration function

32
推荐指数
2
解决办法
10万
查看次数

为什么不能在do while循环的表达式部分中声明变量?

以下语法有效:

while (int i = get_data())
{
}
Run Code Online (Sandbox Code Playgroud)

但以下不是:

do
{
} while (int i = get_data());
Run Code Online (Sandbox Code Playgroud)

我们可以通过标准草案N41406.4节了解原因:

1 [...]

condition:
     expression
     attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
     attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list

2条件规则既适用于选择陈述,也适用于forwhile陈述(6.5).[...]

和第6.5

1迭代语句指定循环.

      iteration-statement: 
             while ( condition ) statement
             do statement while ( expression ) ;

相反,你被迫做一些丑陋的事情:

int i = get_data();
do
{
} while ((i = get_data())); // double parentheses sic
Run Code Online (Sandbox Code Playgroud)

这是什么理由?

c++ declaration do-while

32
推荐指数
4
解决办法
5260
查看次数