C在运行时选择变量类型

C在运行时选择变量类型,c,syntactic-sugar,C,Syntactic Sugar,我有下面这段代码,它看起来非常明确和冗余,有没有办法在运行时选择变量类型 if(header->bitsPerSample == 16) { int sample; for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) { fread(&sample, sizeof(sample), 1, fp); fwrite(

我有下面这段代码,它看起来非常明确和冗余,有没有办法在运行时选择变量类型

if(header->bitsPerSample == 16) {
    int sample;
    for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
        fread(&sample, sizeof(sample), 1, fp);
        fwrite(&sample, sizeof(sample), 1, new);
        fread(&sample, sizeof(sample), 1, fp);
    }
} else if(header->bitsPerSample == 8) {
    char sample;
    for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
        fread(&sample, sizeof(sample), 1, fp);
        fwrite(&sample, sizeof(sample), 1, new);
        fread(&sample, sizeof(sample), 1, fp);
    }
}
if(header->bitsPerSample==16){
int样本;
对于(int i=0;ichunkSize-header\u SIZE+8;i+=sizeof(示例)*2){
fread(&sample,sizeof(sample),1,fp);
fwrite(和样本),sizeof(样本),1,新的;
fread(&sample,sizeof(sample),1,fp);
}
}else if(header->bitsPerSample==8){
煤焦样品;
对于(int i=0;ichunkSize-header\u SIZE+8;i+=sizeof(示例)*2){
fread(&sample,sizeof(sample),1,fp);
fwrite(和样本),sizeof(样本),1,新的;
fread(&sample,sizeof(sample),1,fp);
}
}
我在找这样的东西:

if(header->bitsPerSample == 16) 
    sample is of type int
else if(header->bitsPerSample == 8)
    sample is of type char

for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
        fread(&sample, sizeof(sample), 1, fp);
        fwrite(&sample, sizeof(sample), 1, new);
        fread(&sample, sizeof(sample), 1, fp);
}
if(header->bitsPerSample==16)
样本类型为int
else if(header->bitsPerSample==8)
样本类型为char
对于(int i=0;ichunkSize-header\u SIZE+8;i+=sizeof(示例)*2){
fread(&sample,sizeof(sample),1,fp);
fwrite(和样本),sizeof(样本),1,新的;
fread(&sample,sizeof(sample),1,fp);
}

您不能这样做,我建议您使用相同的变量类型,例如,您可以将int转换为char,您将获得正确的值

C编写通用代码的唯一工具是宏,但这里不需要

跳过声明正确类型的变量的形式,而只读取或写入适当数量的字节:

size_t raw_size = header->bitsPerSample / 8;
unsigned char buffer[raw_size];
void* raw = &buffer;

for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += raw_size * 2) {
  fread(raw, raw_size, 1, fp);
  fwrite(raw, raw_size, 1, new);
  fread(raw, raw_size, 1, fp);
}
size\u t raw\u size=header->bitsPerSample/8;
无符号字符缓冲区[原始大小];
void*raw=&buffer;
对于(int i=0;ichunkSize-header\u SIZE+8;i+=raw\u SIZE*2){
fread(原始,原始尺寸,1,fp);
fwrite(原始,原始尺寸,1,新);
fread(原始,原始尺寸,1,fp);
}

由于您的代码并不真正关心值是什么,也不关心它们需要多少字节,所以您可以使用字符缓冲区。

C中的类型只有在编译时才知道。您可能需要s,您将在
struct
union