如果错误,我该如何返回-C

时间:2014-05-21 11:34:58

标签: c return

基本上我有这个数据结构:

typedef struct Data {
    char *str;
    int n;
} TData, *AData;

我想在哪里使用malloc为str分配空间(在该变量中我放了一个我从文件中读取的字符串,老实说,考虑到我的问题,它并不重要)。因此,我创建了一个函数TData InitData(const char *file_name)

TData InitData(const char *file_name) {
    TData data;

    data.str = malloc(1024);
    if (!data.str) {
        printf("Allocation error!\n");
        // I have no idea what to return here in order to exit the function.
        return (...);
    }

    return data;
}

现在,在我的主要()'功能,我会打这样的电话:

int main(int argc, const char * argv[]) {
    TData data;
    if(!(data = ReadExpression(argv[1]))) {
        return 1;
    }
    // I do something with my data and the program ends.
    return 0;
}

如何在InitData函数中使return语句有效?

我知道另一种方式,可能推荐的方法是将TData datamain发送到InitData作为类型AData的参数并更改类型对int的函数(会产生类似int InitData(const char *file_name, AData data))或仅使用AData的函数。

6 个答案:

答案 0 :(得分:3)

  • 根据经验,始终将结构作为指针参数传递,而不是按值传递。
  • 根据经验,在编写复杂函数时,请保留错误的返回值。

因此,在您的情况下,将函数重写为:

bool InitData (TData* data, const char *file_name);

其中bool可以用枚举替换,以获取更详细的错误代码。现在功能结果只是“ok”或“error”。

答案 1 :(得分:1)

C没有内置的多值返回,所以通常你要做的是

int InitData(const char *file_name, TData *returnedData) { ... }

InitData的返回值是错误/成功标志,并且通过指针返回TData结构。

答案 2 :(得分:1)

我在C中做的不多,但很多功能都是这样的:

int foo(intargs, outargs);

这背后的事情是你分配对象并将其作为引用传递给函数内部。

函数的返回值将是enum或类似的东西进行比较以确定发生了什么。

答案 3 :(得分:1)

我喜欢MicroVirus建议的方式。接受数据作为参数也可用于多线程代码安全。此外,您可以返回操作结果以检入调用代码。你的TData不是一个指针,所以你不能把它设置为NULL,这是一种告诉我认为无效的情况的方法。但是,这里还有另一个问题! InitData中的TData数据是局部变量,应在函数返回时复制。我认为这不是一个很好的性能问题。我建议,接受对象作为参数(例如作为指针)将函数的结果返回给调用代码并检查数据的有效性。您可以设置数据是否为NULL,但是当您返回结果值时,这会使所有内容清除而不检查数据对象本身。

答案 4 :(得分:0)

正常返回data,但请将main()中的代码更改为:

data = ReadExpression(argv[1]);
if ( !data.str ) {
    return 1;
}

你无法返回标量值来代替struct,而你的问题表明你已经知道你可以使用指针而不是选择,所以这是最简单的替代方法。

答案 5 :(得分:0)

您可以在Data-struct集中拥有一个标志,具体取决于if (!data.str)结果,并始终返回data。 每当你想知道发生了什么时,请检查标志。

只是为了澄清: 你可以写这样的东西,或类似的东西:

`typedef struct Data 
{
    char *str;
    int n;
    char myflag;
    const char *file_name;
} TData, *AData;`

`void InitData(TData *data) 
{
    data.str = malloc(1024);
    if (!data.str) 
    {
        printf("Allocation error!\n");
        myflag=0;
    }
    else
    {
        myflag=1;
    }
    return data;
}`

但也请看评论。只想提出另一个观点。