【发布时间】:2023-03-21 02:33:02
【问题描述】:
我知道这个问题有一个 C++ 版本,但是我使用的是标准类型定义而不是模板。
我编写了一个适用于 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 是不可能的?
[开放式问题:]如果没有,你们将如何处理这样的事情?
【问题讨论】:
-
是的,运行时 typedef 是不可能的。编译器需要为
sample s;分配存储空间,因为它必须知道大小。 -
考虑使用
<inttypes.h>(和/或<stdint.h>)和uint16_t和int32_t等。当然,这是来自C99,但即使是逆行编译器通常也提供这种工具(或者可以与标题一起提供)。