标签: declaration

类的前向声明似乎在C++中不起作用

以下代码在VC++ 6中编译.我不明白为什么我得到C2079: 'b' uses undefined class 'B'以下代码的编译错误.

B类来源

#include "B.h"

void B::SomeFunction()
{
}
Run Code Online (Sandbox Code Playgroud)

B级标题

#include "A.h"

struct A;

class B
{
    public:
        A a;
        void SomeFunction();
};
Run Code Online (Sandbox Code Playgroud)

struct A Header

#include "B.h"

class B;

struct A
{
    B b;
};
Run Code Online (Sandbox Code Playgroud)

如果我将B类标题更改为以下内容,则不会出现错误.但标题声明不会在顶部!

具有奇怪标头声明的B类标头

struct A;

class B
{
     public:
        A a;
        void SomeFunction();
};

#include "A.h"
Run Code Online (Sandbox Code Playgroud)

c++ compilation header declaration forward-declaration

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

复杂的声明

我如何解释复杂的声明,如:

int * (* (*fp1) (int) ) [10]; ---> declaration 1
int *( *( *[5])())(); --------> declaration 2
Run Code Online (Sandbox Code Playgroud)

是否有任何规则应该遵循以理解上述声明?

c declaration

13
推荐指数
3
解决办法
3122
查看次数

指针指针和指向数组的指针之间的区别?

鉴于数组的名称实际上是指向数组的第一个元素的指针,以下代码:

#include <stdio.h>

int main(void)
{
    int a[3] = {0, 1, 2};
    int *p;

    p = a;

    printf("%d\n", p[1]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

1按预期打印.

现在,鉴于我可以创建一个指向指针的指针,我写了以下内容:

#include <stdio.h>                                                              

int main(void)                                                                  
{                                                                               
        int *p0;                                                                
        int **p1;                                                               
        int (*p2)[3];                                                           
        int a[3] = {0, 1, 2};                                                   

        p0 = a;                                                                 
        p1 = &a;                                                                
        p2 = &a;                                                                

        printf("p0[1] = %d\n(*p1)[1] = %d\n(*p2)[1] = %d\n",                    
                        p0[1], (*p1)[1], (*p2)[1]);                             

        return 0;                                                               
}
Run Code Online (Sandbox Code Playgroud)

我希望它能够编译和打印

p0[1] = 1
(*p1)[1] = 1
(*p2)[1] = 1
Run Code Online (Sandbox Code Playgroud)

但相反,它在编译时出错,说:

test.c: In function ‘main’:
test.c:11:5: …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers declaration dereference

13
推荐指数
2
解决办法
9444
查看次数

为什么C++变量声明语法不一致?

当我声明C++变量时,我这样做:

int a,b,c,d;
Run Code Online (Sandbox Code Playgroud)

要么

string strA,strB,strC,strD;
Run Code Online (Sandbox Code Playgroud)

即,首先是类型,然后是逗号分隔的变量名称列表.

但是,我声明了这样的指针:

int *a,*b,*c,*d;
Run Code Online (Sandbox Code Playgroud)

和这样的引用:

int &a,&b,&c,&d;
Run Code Online (Sandbox Code Playgroud)

应该是一致的

int* a,b,c,d;
Run Code Online (Sandbox Code Playgroud)

int& a,b,c,d;
Run Code Online (Sandbox Code Playgroud)

为什么不一致?

c++ syntax declaration

13
推荐指数
4
解决办法
1735
查看次数

`int a = 0,b = a`是否有未定义的行为?

问题标题说明了一切:表单的声明int a = 0, b = a是否有未定义的行为?

c++ declaration undefined-behavior

13
推荐指数
2
解决办法
642
查看次数

Go:声明一个新变量并覆盖更高范围的变量,如何?

我无法在任何地方找到答案,所以情况如下:

// err has not yet been declared here
globalVar := "string"
if globalVar == "string" {
    globalVar, err := doSomethingWithString()
    if err != nil {
        // error handling
    }
}
Run Code Online (Sandbox Code Playgroud)

当使用'='时,第二个globalVar声明会产生错误:=:

  • 有了:=它,globalVar declared and not used因为现在globalVar是内部范围内的一个新变量.
  • 有了=它,undefined err因为它还没有被宣布.

因此,基本上,应该有一种方法来定义之间的差别=:=有关声明的左侧每个变量.

我看到两种可能的解决方案,在我看来同样丑陋:

// err has not yet been declared here
globalVar := "string"
if globalVar == "string" {
    globalVar2, err := doSomethingWithString()
    if err != …
Run Code Online (Sandbox Code Playgroud)

scope declaration go

13
推荐指数
1
解决办法
3399
查看次数

为什么我们可以在C++的构造函数中使用声明的变量

由于这种代码,我最近遇到了一些奇怪的错误.

vector<int> a(a);
Run Code Online (Sandbox Code Playgroud)

为什么接受上面的代码?什么时候需要?如何要求编译器禁止这种用法?谢谢.

c++ constructor declaration

13
推荐指数
1
解决办法
218
查看次数

为什么声明是必要的

我目前正在教同事.Net,他问我一个困扰我的问题.

我们为什么要申报?

如果var是隐式类型,为什么我们甚至要声明?

Animal animal = new Animal();
Run Code Online (Sandbox Code Playgroud)

var animal = new Animal();
Run Code Online (Sandbox Code Playgroud)

可能成为

animal = new Animal();
Run Code Online (Sandbox Code Playgroud)

隐式类型仍然意味着这是一个静态类型的变量.

如果为变量分配了两种不同的类型,如果它们不共享基类(除了对象),则可能是编译器错误.

是否有技术原因无法完成或风格上我们喜欢有没有

.net c# variables clr declaration

13
推荐指数
3
解决办法
634
查看次数

Haskell - 声明多个函数的类型

我经常发现自己编写了同一类型的多个函数.我们称之为这种类型FuncType.我可能写这样的东西:

funcA :: FuncType
funcB :: FuncType
funcC :: FuncType
funcD :: FuncType

-- Implementations
Run Code Online (Sandbox Code Playgroud)

这感觉就像许多不必要的打字一样(键入键盘时键入,而不是声明功能类型).有没有办法更简洁地做到这一点?我想要的东西看起来像是:

(funcA, funcB, funcC, funcD) :: FuncType

-- Implementations
Run Code Online (Sandbox Code Playgroud)

我真的试图谷歌这个,但我空了.如果这不是该语言的一个特征,为什么不呢?我错过了什么吗?如果我发现自己需要这个,我会做错吗?

haskell types declaration

13
推荐指数
1
解决办法
616
查看次数

C标准中对可变修改类型的switch语句约束的说明

我正在编写C编译器,当我执行该switch语句时,一个约束使我很困惑。标准的 6.8.4.2p2节规定:

如果switch语句在标识符的范围内具有关联的大小写或默认标签,且标识符的类型可变,则整个switch语句应在该标识符的范围内。

带有脚注:

也就是说,声明要么在switch语句之前,要么在最后一个case或默认标签之后,该标签与包含该声明的块中的switch关联。

我真的不明白这个约束的含义。可以给我一个例子吗?

c label goto declaration switch-statement

13
推荐指数
1
解决办法
336
查看次数