我知道这个问题有一个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不可能?
[开放式问题:]如果没有,你们会怎样处理这样的事情?
答案 0 :(得分:5)
typedef
是一个编译器功能,您无法在运行时应用它。
答案 1 :(得分:3)
程序中的所有类型必须在编译时知道。
在C ++中,您可以使用模板编译short
和int
的代码;在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位代码,确保函数名称一致地更改。