C中的运行时条件typedef

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

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

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

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

#include  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不可能?

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

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

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

将计算代码放在一个名为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) ,然后您可以在其他地方使用它们。

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

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

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

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

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

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

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

例如

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

但同样,类型是在编译时决定的

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

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

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