c - 在 switch case 语句中声明变量

标签 c casting switch-statement

我在 C 中的代码具有如下所示的 switch case 语句。

float value_calc ( Type_t type, void *in_data)
{
     switch ( type)
     {
          case 0:
          {
            int * data = (int*)in_data;
          }
          break;
          case 1:
          {
           float * data = (float*)in_data;
          }
          break;   <-- error :- data: redefinition; different basic types.  
          case 3:
          {
            double * data = (double*)in_data;
          }
          break;
          default:
                return 0;
       }
      for (int i =0; i< 1024; i++)
      {
          float capture = * (data + i) + diff; <-- error identifier data is undefined
      }                

此处,Type_t 是具有数据类型 int =0 的枚举作为第一个成员,序列中的其他成员是 floatdouble

我试过不使用大括号,也尝试过在一些答案中按照此处提到的那样放置分号。但它没有被编译。

我该如何正确提及,因为变量将根据不同的情况使用不同的数据类型。

最佳答案

你声明定义了三个局部变量,在它们极小的范围之外没有任何可见的效果。它们分别停止在它们自己的 } 上可用,即立即停止。这就是为什么 错误标识符数据未定义

顺便说一下,这些小范围是您可以编译第一个代码片段的唯一原因,否则这些定义会与在同一范围内使用不同类型定义相同标识符发生冲突。

稍后您将尝试在运行时使用具有不同类型的标识符 data
你不能。

我认为以上部分是为了回答您关于发生的错误的问题,并解决您似乎存在的基本误解。下面找到一种方法的替代想法。

这可能需要稍微重新设计。类型(数据指针指向的内容)影响程序如何处理它在引用指针时找到的内容。您显示的循环似乎依赖于通过指针类型选择该处理。您需要使用在运行时不会更改类型的指针更明确地执行此操作,仅仅是因为在 C 中指针变量不能这样做。

其他答案显示了基于 struct-with-union 的解决方案,看看它们。

不过,我认为退后一步并在更大范围内重新考虑是值得的(即我怀疑这里存在 XY 问题...)。
如果您可以使用 Type_t type 参数携带的信息并选择相应的处理方法,然后可以“意识到”指向的类型,事情就会容易得多。
这基本上意味着将 switch 语句放入循环中,或者将循环放入 switch 语句中。因为我猜你正在寻找速度,所以你应该尝试两者并计算它们的时间。

关于c - 在 switch case 语句中声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64536747/

相关文章:

java - 如何正确使用Reflector Class.cast()?

javascript - 使用 switch 语句来处理 irc 服务器代码会很荒谬吗?

swift - 小于或大于 Swift switch 语句

javascript - 全局变量在开关内不起作用 - javascript

java - 如何在 Java 中将 Map<?,?> 转换为类型化 Map?

c# - 如何将对象转换为作为参数传递的类型

c - 如何使用 Sublime Text 生成程序集输出?

c - LIne 不使用 glFrustum() 显示?

c - C 中 read() 和 fgets() 的区别

c - 如何用 fork 和 mkfifo 制作一个进程环?