1

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

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’

注意 如果我printfcoutstdio替换iostream并将扩展名命名为.cpp(!),我不会收到任何错误。这是为什么 ?难怪我用它编译它g++

4

3 回答 3

5

如果您不 typedef 结构,则必须在结构名称前面指定结构,同时声明它,如下所示:

struct tester t;

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

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

更新

以下是来自 Adam Rosenfield 的引述。C++ 中“struct”和“typedef struct”的区别?

在 C++ 中,所有 struct/union/enum/class 声明的行为就像它们是隐式类型定义的,只要名称没有被另一个具有相同名称的声明隐藏。

于 2012-10-25T16:09:43.227 回答
1

你的结构没有命名。使用struct tester t;或使用 typedef

于 2012-10-25T16:09:06.343 回答
0

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

于 2015-11-22T04:35:09.367 回答