错误:'unsigned'之前的预期表达式

时间:2013-05-15 15:04:11

标签: c optimization

使用 .wav 文件... * ptr_8和* ptr_16 - 指向样本数组的指针。

我想让程序根据标题的数据声明这些指针(如果8 bitsPerSample --->声明* ptr_8 ......)

if ( hdr.S1.BitsPerSample == 8 )        // Declaring array for samples. Depending
                                        // on header's data (8 or 16 bits).
    unsigned char *ptr_8;
else
    if ( hdr.S1.BitsPerSample == 16 )
        unsigned short *ptr_16;

问题是它写道:

error: expected expression before 'unsigned'

到两行(必须声明*ptr_8*ptr_16)虽然我没有看到这种行为的原因。 请告诉我有什么问题。


更新

事实证明,声明是一个编译时的概念(见下面接受的答案)。

变量在编译时被声明,所以它需要机器的资源一次然后(当你编译应用程序时)它们都已经在那里声明了。这意味着它是尝试优化程序的最糟糕方式之一......

2 个答案:

答案 0 :(得分:5)

您无法根据运行时条件有条件地进行变量声明:必须无条件地声明这两个变量,即使其余代码只使用其中一个。

使声明成为条件的唯一方法是使用预处理器的条件编译,这看起来并不适用,因为你的条件是基于文件的标题,所以它显然是运行时的。

您可以将处理放在if的两个分支中,如下所示:

if (hdr.S1.BitsPerSample == 16) {
    unsigned short *ptr_16;
    // Use ptr_16 here
} else if (hdr.S1.BitsPerSample == 8) {
    unsigned char *ptr_8;
    // Use ptr_8 here
}
// Neither ptr_16 nor ptr_8 is available here

答案 1 :(得分:1)

为什么你不能只是声明两个指针然后只填充你想要使用的指针?无论如何,问题与范围有关 - 如果你想在if块中声明变量,它需要有大括号,然后变量只在该大括号块内有效。