【问题标题】:Return Different Data Types in C Function在 C 函数中返回不同的数据类型
【发布时间】:2012-01-14 04:12:30
【问题描述】:

我有以下情况:

void func ()
{
    TEST_MACRO(....., ret_type)
    ..........
}

some_ptr* func2()
{
    TEST_MACRO(....., ret_type)
    ..........
}

int func3()
{
    TEST_MACRO(....., ret_type)
    ..........
}

我有 3 种类型的功能。在每个函数中,我必须对同一个变量(局部变量)进行范围检查。

根据成功/失败,我必须在宏中进行错误处理:

TEST_MACRO()
{
 // FAILURE
 if (ret_val == VOID_TYPE)
 {
    return;
 }
 else if (ret_val == RET_PTR)
 {
    return NULL;
 }
 else /* ret_val = INT */
 {
    return FAILURE;
 }
}

但最终,所有预处理器代码都将落入同一个函数中。

Problem:

int func3 ()
{
  // Entire Error Handling
  if (..)
    return;
  else if(..)
    return NULL;
  else
    return FAILURE;
}

这是不可能的,但要实现相同的功能,即对 SIMILAR 局部变量进行范围检查,使用 3 个不同的宏(每个返回类型一个)似乎不是一个干净的方法。

有人可以建议我一些处理这种情况的好方法吗?

【问题讨论】:

    标签: c function user-defined-functions


    【解决方案1】:

    流量控制宏是出了名的邪恶。而是让你的宏产生一个布尔值,并在你的函数中响应它。这样更清楚:

    void func ()
    {
        if(!TEST_MACRO(.....))
             return;
        .......... 
    } 
    
    int func ()
    {
        if(!TEST_MACRO(.....))
             return FAILURE;
        .......... 
    } 
    

    【讨论】:

    • 比我的答案好得多,但我会在这个答案上添加类型特定宏的使用。
    • 没办法。在这种特殊情况下,特定于类型的宏(C11 尚未得到广泛支持)只会助长糟糕的设计。
    • 谢谢你,我已经纠正了。我已经好几年没用过 C 了,所以我的 cmets 并不是基于当前的想法。
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 2011-06-27
    • 2017-08-18
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多