C中的运行时条件typedef

时间:2012-07-18 12:20:39

标签: c types typedef

我知道这个问题有一个C ++版本,但是我使用的是标准的typedef而不是模板。

我编写了一个适用于16位wav文件的程序。它通过将每个样品加载到一个短片中来实现。然后程序在短路上执行算术。

我现在正在修改程序,因此它可以同时使用16位和32位的wav。我希望做一个条件typedef,即使用16位的short和32位的int。但后来我意识到,如果编译器事先不知道变量的类型,编译器可能就不会编译代码。

所以我试着测试下面的代码:

#include <stdio.h>

int
main()
{
  int i;
  scanf("%i", &i);

  typedef short test;

  if(i == 1)
    typedef short sample;
  else 
    typedef int sample;

  return 0;
}

得到了以下编译器错误:

dt.c: In function ‘main’:
dt.c:12:5: error: expected expression before ‘typedef’
dt.c:14:5: error: expected expression before ‘typedef’

这是否意味着C中的运行时条件typedef不可能?

[开放式问题:]如果没有,你们会怎样处理这样的事情?

5 个答案:

答案 0 :(得分:5)

typedef是一个编译器功能,您无法在运行时应用它。

答案 1 :(得分:3)

程序中的所有类型必须在编译时知道。

在C ++中,您可以使用模板编译shortint的代码;在C中,您可以使用宏(特别是X-macros)来完成此操作。

将您的计算代码放在一个名为eg的单独文件中dt.tmpl.c,然后在dt.c写:

#define sample int
#include "dt.tmpl.c"

#define sample short
#include "dt.tmpl.c"

然后,您的dt.tmpl.c代码可以使用sample作为预处理程序令牌来命名类型并粘贴到函数名称中,例如:

#define PASTE(name, type) name ## _ ## type
#define FUNCTION_NAME(name, type) PASTE(name, type)

sample FUNCTION_NAME(my_calculation, sample)(sample i) {
    return i * 2;
}

这将产生两个函数int my_calculation_int(int i)short my_calculation_short(short i),您可以在其他地方使用这些函数。

答案 2 :(得分:2)

首先,typedef不是新类型,它是别名或简短形式,以使事情更方便(特别是在使用函数指针时)

C是一种静态语言,在运行时无法创建类型,需要在编译/链接时解析类型。

如果可能的话,Windows API可能会小得多:)

在Windows中,对于大多数每个API调用都有两个版本的函数,以及一个决定使用哪个函数的定义。

e.g。

#ifndef UNICODE
#define myfunction _myfunctionA(TCHAR* p);
#else
#define myfunction _myfunctionW(TCHAR* p);
#endif

但同样,类型是在编译时间

决定的

答案 3 :(得分:2)

另一方面,您只能在某个范围内使用typedef

int 
main(void) {
    if (1) {
        typedef short sample;
        sample n; // OK
    }
    sample u; // ERROR
    return 0;   
}

答案 4 :(得分:0)

C(和C ++)中的类型在编译时是固定的; “运行时typedef”的概念在C中没有意义。

但是,您的问题可以谨慎解决。您将定义两组函数(和类型),一组用于处理16位.wav文件,另一组用于处理32位.wav文件。这些将在编译时定义,类型的大小将在编译时修复,但是大量代码将在可执行文件中,并且您将能够根据运行选择执行哪组函数 - 时间信息(您要求处理或生成的文件类型)。

您的两组功能应该是对称的。您可能可以使用一些“类似模板”的机制,以便您编译同一个文件两次,一次用于32位代码,一次用于16位代码,确保函数名称一致地更改。