C 当涉及职能时,结构、工会等的范围如何工作?

C 当涉及职能时,结构、工会等的范围如何工作?,c,C,我最近遇到了一些结构,有些事情不太清楚。假设我有一个这样的程序: struct num print_a(struct num c); int main(){ struct num{ int a; int b; }c = {1, 2}; struct num d; d = print_a(c); } struct num print_a(struct num c){ printf("%d", c.a); return c; } 这是可行的还是我必须在

我最近遇到了一些结构,有些事情不太清楚。假设我有一个这样的程序:

struct num print_a(struct num c); 

int main(){
  struct num{
    int a;
    int b;
  }c = {1, 2};
  struct num d;
  d = print_a(c);
}

struct num print_a(struct num c){
  printf("%d", c.a);
  return c;
}
这是可行的还是我必须在main之外声明struct num?因为我的函数print_a怎么能看到struct num是什么意思,当它在其作用域之外声明时,它必须返回的类型

对不起,如果这个问题是愚蠢的

这是可行的还是我必须在main之外声明struct num

那么,为什么不干脆试试呢

给出:

给出:

嗯。。。给我们一个答案:不,它不会起作用

在main内部定义结构时,它仅在main内部已知。如果要在main之外使用结构,则必须将结构的定义移出main,如:

struct num {
    int a;
    int b;
};

struct num print_a(struct num c); 

int main(){
  struct num c = {1, 2};
  struct num d;
  d = print_a(c);
}

struct num print_a(struct num c){
  printf("%d", c.a);
  return c;
}
这是可行的还是我必须在main之外声明struct num

那么,为什么不干脆试试呢

给出:

给出:

嗯。。。给我们一个答案:不,它不会起作用

在main内部定义结构时,它仅在main内部已知。如果要在main之外使用结构,则必须将结构的定义移出main,如:

struct num {
    int a;
    int b;
};

struct num print_a(struct num c); 

int main(){
  struct num c = {1, 2};
  struct num d;
  d = print_a(c);
}

struct num print_a(struct num c){
  printf("%d", c.a);
  return c;
}
宣言

struct num print_a(struct num c);
在示例的开头,代码告诉编译器:

您承诺在文件范围内定义struct num。目前,编译器将struct num标记为不完整类型,可以在某些声明中使用它,例如,声明但不定义函数,以及声明或定义指针类型和变量。除非您实际尝试使用struct num类型,否则编译器不会要求您遵守此承诺

必须先完成struct num的定义,然后才能在定义或声明中使用该类型,因为该类型的大小很重要

您承诺定义一个名为print_a的函数,使用struct num并返回struct num。除非您实际尝试使用此函数,否则编译器不会要求您遵守此承诺-如果您实际上没有在程序中的任何地方调用它,编译器将原谅未实现的承诺

在函数main中定义的struct num与文件范围中不完整的struct num无关。当然,您可以继续定义它,但它会影响文件级结构num

声明

d = print_a(c);
内部函数main不正确,将导致编译器生成多条错误消息,因为它违背了您所做的承诺。具体来说,编译器会抱怨您试图使用在文件范围内声明的不完整类型struct num,就好像它是完整的一样。记住,main中定义的struct num与文件级的struct num无关

函数定义

struct num print_a(struct num c){ ... }
是不正确的,因为您没有遵守定义类型struct num的承诺。main中有另一个名为struct num的类型不算数;该类型仅在main中可用

要更正程序,需要将struct num的定义移到main之前。它可以在打印声明之前或之后出现

宣言

struct num print_a(struct num c);
在示例的开头,代码告诉编译器:

您承诺在文件范围内定义struct num。目前,编译器将struct num标记为不完整类型,可以在某些声明中使用它,例如,声明但不定义函数,以及声明或定义指针类型和变量。除非您实际尝试使用struct num类型,否则编译器不会要求您遵守此承诺

必须先完成struct num的定义,然后才能在定义或声明中使用该类型,因为该类型的大小很重要

您承诺定义一个名为print_a的函数,使用struct num并返回struct num。除非您实际尝试使用此函数,否则编译器不会要求您遵守此承诺-如果您实际上没有在程序中的任何地方调用它,编译器将原谅未实现的承诺

在函数main中定义的struct num与文件范围中不完整的struct num无关。当然,您可以继续定义它,但它会影响文件级结构num

声明

d = print_a(c);
内部函数main不正确,将导致编译器生成多条错误消息,因为它违背了您所做的承诺。具体来说,编译器会抱怨您试图使用在文件范围内声明的不完整类型struct num,就好像它是完整的一样。记住,main中定义的struct num与文件级的struct num无关

函数定义

struct num print_a(struct num c){ ... }
是不正确的,因为您没有遵守定义类型struct num的承诺。main中有另一个名为struct num的类型不算数;该类型仅在main中可用

要更正程序,需要将struct num的定义移到main之前。信息技术
可以在print_a声明之前或之后出现。

对于struct num print_astruct num c,您可以告诉编译器函数print_a有一个struct num类型的参数,我们在函数的其余部分调用它。它与源代码中其他地方名为c的struct num无关。哦,我明白了。Yes struct num应该在main之外贴花,因为定义在main之外不存在。@PaulOgilvie如果函数没有返回任何值,会有什么不同吗?如果它是void类型,并且只使用c作为参数,我还需要在main之外声明它吗?当然可以。函数需要知道它作为参数的结构的定义,不是吗?@4386427我想知道它背后的理论,我的书总是让它听起来像是在main中声明的,然后在main之外的函数中工作,这让我对struct num print_astruct num c有些怀疑,你告诉编译器函数print_a有一个struct num类型的参数,我们在函数的其余部分称之为c。它与源代码中其他地方名为c的struct num无关。哦,我明白了。Yes struct num应该在main之外贴花,因为定义在main之外不存在。@PaulOgilvie如果函数没有返回任何值,会有什么不同吗?如果它是void类型,并且只使用c作为参数,我还需要在main之外声明它吗?当然可以。函数需要知道它作为参数的结构的定义,不是吗?@4386427我想知道它背后的理论,我的书总是让它听起来像是在main中声明的,然后在main之外的函数中工作,这让我对你承诺定义struct num有些怀疑,因为编译器现在需要生成代码来返回完整的结构。如果你的语句涉及到一个指针,它就可以了。编译器不需要生成代码,除非程序实际调用函数。如果程序实际调用了函数,而此时类型仍然不完整,编译器会大声抱怨;这属于在我的回答中尝试使用类型;第三点。@PaulOgilvie:这和我说的有什么不同?我说过struct num的定义可以在函数声明之前或之后出现,而不是定义。@PaulOgilvie:Point 1,first bullet,列出了不完整类型的合法用法。bullet没有显式表示它必须在首次使用之前完全声明。项目符号允许在使用后声明它,这会生成一个错误。我想知道您是否承诺定义struct num,因为编译器现在需要生成代码以返回完整的结构。如果你的语句涉及到一个指针,它就可以了。编译器不需要生成代码,除非程序实际调用函数。如果程序实际调用了函数,而此时类型仍然不完整,编译器会大声抱怨;这属于在我的回答中尝试使用类型;第三点。@PaulOgilvie:这和我说的有什么不同?我说过struct num的定义可以在函数声明之前或之后出现,而不是定义。@PaulOgilvie:Point 1,first bullet,列出了不完整类型的合法用法。bullet没有显式表示它必须在首次使用之前完全声明。项目符号允许在使用后声明它,这将生成一个错误。