我知道这个问题有一个C++版本,但是我使用的是标准的typedefs而不是模板。
我写了一个可以处理16位wav文件的程序。它通过将每个样本加载到一个短片中来实现这一点。然后,程序对短值执行算术运算。
我现在正在修改程序,以便它可以与16位和32位wavs一起使用。我希望做一个条件类型定义,也就是用short表示16位,int表示32位。但后来我意识到,如果编译器事先不知道变量的类型,它可能不会编译代码。
因此,我尝试测试以下代码:
#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中运行时条件typedefs是不可能的?
开放式问题:如果没有,你们会如何处理这样的事情?
发布于 2012-07-18 20:29:41
程序中的所有类型在编译时都必须是已知的。
在C++中,您可以使用模板为short和int编译代码;在C中,您可以使用宏(特别是X宏)来编译代码。
将您的计算代码放在一个名为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),然后您可以在其他地方使用它们。
发布于 2012-07-18 20:25:13
typedef是一个编译器特性,你不能在运行时应用它。
发布于 2012-07-18 20:28:48
首先,类型定义不是一个新的类型,它是一个别名或缩写形式,以使事情更方便(特别是在使用函数指针时)
C是一种静态语言,你不能在运行时创建类型,类型需要在编译/链接时解析。
好吧,如果可能的话,windows API会小得多:)
在windows中,几乎每个API调用都有两个版本的函数和一个决定使用哪个函数的定义。
例如:
#ifndef UNICODE
#define myfunction _myfunctionA(TCHAR* p);
#else
#define myfunction _myfunctionW(TCHAR* p);
#endif但同样,类型是在编译时决定的
https://stackoverflow.com/questions/11541226
复制相似问题