以下代码在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) 我如何解释复杂的声明,如:
int * (* (*fp1) (int) ) [10]; ---> declaration 1
int *( *( *[5])())(); --------> declaration 2
Run Code Online (Sandbox Code Playgroud)
是否有任何规则应该遵循以理解上述声明?
鉴于数组的名称实际上是指向数组的第一个元素的指针,以下代码:
#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++变量时,我这样做:
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)
为什么不一致?
问题标题说明了一切:表单的声明int a = 0, b = a是否有未定义的行为?
我无法在任何地方找到答案,所以情况如下:
// 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) 由于这种代码,我最近遇到了一些奇怪的错误.
vector<int> a(a);
Run Code Online (Sandbox Code Playgroud)
为什么接受上面的代码?什么时候需要?如何要求编译器禁止这种用法?谢谢.
我目前正在教同事.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)
隐式类型仍然意味着这是一个静态类型的变量.
如果为变量分配了两种不同的类型,如果它们不共享基类(除了对象),则可能是编译器错误.
是否有技术原因无法完成或风格上我们喜欢有没有
我经常发现自己编写了同一类型的多个函数.我们称之为这种类型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)
我真的试图谷歌这个,但我空了.如果这不是该语言的一个特征,为什么不呢?我错过了什么吗?如果我发现自己需要这个,我会做错吗?
我正在编写C编译器,当我执行该switch语句时,一个约束使我很困惑。标准的 6.8.4.2p2节规定:
如果switch语句在标识符的范围内具有关联的大小写或默认标签,且标识符的类型可变,则整个switch语句应在该标识符的范围内。
带有脚注:
也就是说,声明要么在switch语句之前,要么在最后一个case或默认标签之后,该标签与包含该声明的块中的switch关联。
我真的不明白这个约束的含义。可以给我一个例子吗?
declaration ×10
c++ ×4
c ×3
.net ×1
arrays ×1
c# ×1
clr ×1
compilation ×1
constructor ×1
dereference ×1
go ×1
goto ×1
haskell ×1
header ×1
label ×1
pointers ×1
scope ×1
syntax ×1
types ×1
variables ×1