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 ++中,您可以使用模板编译short
和int
代码; 在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位代码,确保函数名称一致更改。