【问题标题】:C choosing variable type at run-timeC在运行时选择变量类型
【发布时间】:2019-04-18 19:27:00
【问题描述】:

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

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) 
    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);
}

【问题讨论】:

  • C 中的类型仅在编译时才知道。你可能想要tagged unions,你会在structunion之上构建它们

标签: c syntactic-sugar


【解决方案1】:

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);
}

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

【讨论】:

    【解决方案2】:

    你不能这样做,我建议你使用相同的变量类型,例如你可以将一个 int 转换为 char 并且你会得到正确的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2011-12-31
      相关资源
      最近更新 更多