【问题标题】:Check typeof variable with typeof in C在 C 中使用 typeof 检查 typeof 变量
【发布时间】:2020-03-30 04:57:51
【问题描述】:

我有一个我不输入的变量。所以要打印我不知道是使用%d还是%f。为此,我想在打印之前检查它的类型。

现在来检查我想这样使用的类型:

if (typeof(int) == voltage) {
snprintf(chars, sizeof(chars), "%d", voltage);
}

现在这是无效的。

我需要一种方法来检查变量类型。

我正在使用两个变量进行测试,但我认为以下也是无效的。

以及如何使用我从herehere得到并修改的这个getIntType函数/(它叫什么?宏?)?

#define getIntType(a,b)  ({ __auto_type _a = (a); __auto_type _b = (b); _a == typeof(int) ? _a : _b; });

        int a = 10;
        double b = 20.0;
    int x = getIntType(a,b)==?; //How to call and how to store in type var of this x?

以及如何从宏中返回值/如何使用它?

        #define typecheck(type,x) \
        ({  type __dummy; \
        typeof(x) __dummy2; \
        (bool)(&__dummy == &__dummy2); \
        }) // How to return value to check?


    //Then how to check?
        int a = 10;
        double b = 20.0;
       //int x = getIntType(a,b)? a : b;

        //bool isInt = typecheck(typeof(int), a);

【问题讨论】:

  • typeof 是 GCC 扩展,而不是标准运算符。
  • 我从 SO 中的其他问题中读到了这一点。我需要检查变量的类型。那么用什么?
  • 你怎么会不知道voltage变量的类型呢?你不是在程序前面声明了吗?
  • 它来自哪里并不重要。您需要先声明变量,然后才能将 API 响应读入其中。
  • @Rifat:Barmar 的意思是这个函数必须有一个已知的 C 语言声明,即void battery_get_level_status(double * output),这意味着output 只能是double。因此,如果您想为多种不同类型重用相同的函数,泛型将帮助您,但您将在调用时知道变量的实际类型,因为 C 根本不支持多态性或继承。换句话说,如果您在您最喜欢的 IDE 中将鼠标悬停在 battery_status 上,您可能会得到一个工具提示。这个工具提示说什么?

标签: c typeof


【解决方案1】:

如果你想要一个可移植的解决方案,你可以看看 C11 泛型宏,可怜的 C 程序员相当于 C++ 多态 :-)

以下程序展示了如何使用它:

#include <stdio.h>

#define Output(buff, sz, T) _Generic((T), \
    char *: OutputS, \
    double: OutputD, \
    int: OutputI \
)(buff, sz, T)
void OutputS(char *buff, size_t sz, char *s)  { snprintf(buff, sz, "S %s", s); }
void OutputD(char *buff, size_t sz, double d) { snprintf(buff, sz, "D %f", d); }
void OutputI(char *buff, size_t sz, int i)    { snprintf(buff, sz, "I %d", i); }

int main() {
    char buff[100];
    Output(buff, sizeof(buff), "hello"); puts(buff);
    Output(buff, sizeof(buff), 5);       puts(buff);
    Output(buff, sizeof(buff), 3.14159); puts(buff);
}

可以看到根据数据类型调用了正确的函数:

S hello
I 5
D 3.141590

【讨论】:

  • 这个答案很酷,符合我对这个问题的预期。但是在使用 buff 进行 strcat 操作以完全存储所有值 (char *str[1024]; strcat(str,buff)) 之后,我在开始时得到一些垃圾值,我不知道它来自哪里或如何删除它。能不能给个解决办法?
  • @Rifat,这可能应该是一个不同的问题,但在这里。正确的定义是 char str[1024] 开始(你想要一个字符数组,而不是字符指针数组)。而且,当您在堆栈上创建变量而不进行初始化时,它们具有任意值。所以要么char str[1024] = {0} 要么将第一个操作设为strcpy(创建一个新字符串)而不是strcat(附加到现有字符串)。
猜你喜欢
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2014-05-16
  • 2014-09-01
  • 2021-03-20
相关资源
最近更新 更多