尝试将结构传递给函数时出错

时间:2012-10-25 16:07:35

标签: c linux gcc compiler-errors structure

在下面的程序中,我尝试将结构传递给函数。但我得到错误,我不明白为什么。我在这个程序中犯了什么错误?

我正在使用gcc来编译此c程序。

#include <stdio.h>

struct tester {
  int x;
  int *ptr;
};

void function(tester t);

int main() {
 tester t;
 t.x = 10;
 t.ptr = & t.x;
 function(t);
}

void function(tester t) {
   printf("%d\n%p\n",t.x,t.ptr);
}

错误:

gcc tester.c -o tester

tester.c:8:15: error: unknown type name ‘tester’
tester.c: In function ‘main’:
tester.c:12:2: error: unknown type name ‘tester’
tester.c:13:3: error: request for member ‘x’ in something not a structure or union
tester.c:14:3: error: request for member ‘ptr’ in something not a structure or union
tester.c:14:13: error: request for member ‘x’ in something not a structure or union
tester.c: At top level:
tester.c:18:15: error: unknown type name ‘tester’

注意如果我将printf替换为cout,将stdio替换为iostream,并将扩展名命名为.cpp(!),我没有错误。这是为什么 ?难怪我使用g++

编译它

3 个答案:

答案 0 :(得分:5)

如果你没有键入构造结构,你必须在结构名称前面指定struct,同时声明它:

struct tester t;

要么您这样做,要么执行以下操作:

typedef struct {
  int x;
  int *ptr;
}tester;

更新

以下是来自以下帖子Difference between 'struct' and 'typedef struct' in C++?的Adam Rosenfield的引用:

  

在C ++中,所有struct / union / enum / class声明都表现为隐式typedef,只要该名称不被另一个具有相同名称的声明隐藏。

答案 1 :(得分:1)

您的结构未命名。使用struct tester t;或美国的typedef

答案 2 :(得分:0)

问题是你正在尝试用gcc编译,这是一个“c语言”编译器,你正在遵循C ++风格的代码。
只需 structname variablename;
就可以创建一个struct变量 但是在c ++中,你必须明确地告诉编译器它是一个类似于的结构 struct structname variablename; 只是做到这一点,你会没事的,否则你可以使用一个typedef,基本上你现在告诉编译器表单你将把结构测试器调用到只有测试器,这将更适合你,因为你只需要一个未成年人更改。