所有C编译器都允许函数返回结构吗?

时间:2010-03-10 19:10:55

标签: c struct 8051 sdcc

我正在使用C语言编写程序,并将SDCC编译器用于8051架构设备。 我正在尝试编写一个名为GetName的函数,它将从Flash Memory中读取8个字符并以某种形式返回字符数组。我知道不可能在C中返回一个数组,所以我试图用这样的结构来做它:

//********************FLASH.h file*******************************
MyStruct GetName(int i);  //Function prototype

#define NAME_SIZE  8

typedef struct
{
    char Name[NAME_SIZE];
} MyStruct;

extern MyStruct GetName(int i);


// *****************FLASH.c file***********************************
#include "FLASH.h"

MyStruct GetName( int i)
{
     MyStruct newNameStruct;

     //...
     // Fill the array by reading data from Flash 
     //...

     return newNameStruct;
}

我还没有对此函数的任何引用,但由于某种原因,我收到一个编译器错误,上面写着“函数无法返回聚合”。这是否意味着我的编译器不支持返回结构的函数?或者我只是做错了什么?

4 个答案:

答案 0 :(得分:13)

SDCC doesn't support assignment and returning structs yet(如果他们的Wiki是最新的):

  

尚未在sdcc中实施:

     
      
  • 数据类型为double。
  •   
  • 无法分配结构和联合,作为函数参数传递或返回值。
  •   
  • 在函数参数中注册存储类说明符。
  •   

也许你应该做一个

void GetName(MyStruct* ret_name, int i);

功能改为。


那就是说,你应该把功能原型 放在 之前的main 之后 MyStruct。如果没有原型,则假定函数返回int

MyStruct GetName(int i);
void main(void) { ...

(另外,main函数应该是int main(void)int main(int argc, char** argv)。它不应该返回void。)

答案 1 :(得分:6)

所有post-ANSI C89 / 90编译器都允许返回struct对象。经典(迂腐)K& R C编译器没有。

但是,无论如何你必须先声明这个函数。即之前你打电话给它。结构中的char[8] Name不是有效的声明。有效表格为char Name[8]

正确声明了指向数组的指针返回函数。这是你的尺寸宏被打破了。应该是

#define NAME_SIZE 8 

注意:没有=个字符。

答案 2 :(得分:1)

是的,函数可以在C中返回结构。上面的代码有几个错误。通过一些更改,它在gcc下正确编译(我没有安装sdcc试用,但请尝试下面的代码。

 struct MyStruct
 {
   char Name[8];
 }; 

 struct MyStruct GetName( int i)
 {
      struct MyStruct newNameStruct;

      //...
      // Fill the array by reading data from Flash 
      //...
     return newNameStruct;
 } 


 int main(void)
 {
     int NameIndex = 3;
     struct MyStruct testStruct;
     testStruct = GetName(NameIndex);
     return 0;  
 }

答案 3 :(得分:0)

我真的不想使用没有实现结构调用并按值返回的C编译器,正如KennyMT所建议的那样。实际上,这样的编译器实际上不应该被称为C编译器。如果编译器完全实现了结构,那么按值返回并不难实现。

无论如何,要使用编译器,您需要以下内容:

typedef struct
{
    char Name[NAME_SIZE];
} MyStruct;

void f( MyStruct * m ) {
   strcpy( m->Name, "foo" );
}

int main() {
    MyStruct ms;
    f( & ms );
    return 0;
}