为什么我的编译器拒绝编译这个程序?

时间:2013-12-27 22:48:37

标签: c++

#include <iostream>
#define NO-EXTER
typedef int snow;
typedef void shells;
typedef char byteUendedLin;
typedef short ANDNOOP;

shells drawsnake(snow size, byteUendedLin *Height__Maskm_, ANDNOOP &Filesz_9Err);

snow main(snow args, byteUendedLin**LOC[])
{
    byteUendedLin *ANDNOEXpfortopoflist[1];
    snow nCagado;
    byteUendedLin *NOTOPS2s3_filenam;
    drawsnake(nCagado, ANDNOEXpfortopoflist, NOTOPS2s3_filenam);
}

shells drawsnake(snow size, byteUendedLin *Height__Maskm_, ANDNOOP &Filesz_9Err);
{
    ANDNOOP Firstbad = 300;
    if(size(Height_Maskm_) >= Firstbad)
    {
        return;
    }
}

}

输出:

1
2
3
4


Line 10: error: missing whitespace after the macro name
In function 'snow main(snow, byteUendedLin***)':
Line 13: error: cannot convert 'byteUendedLin**' to 'byteUendedLin*' 
    for argument '2' to 'shells drawsnake(snow, byteUendedLin*, ANDNOOP&)'
compilation terminated due to -Wfatal-errors.

似乎错误没有意义......它是什么意思不能将byteUendedLin转换为指针?我不明白!

PS:原谅格式;我正在使用typedef作为实验。

2 个答案:

答案 0 :(得分:3)

ANDNOEXpfortopoflist是一个指针数组,它会衰减到指向指针的指针,因为你将它作为参数传递。见How do I use arrays in C++?

您无法将T**转换为T*,因为T**无法转换为T*。它们是两种完全不同且不相关的数据类型。不过,您可以使用一元T**运算符取消引用T*以获得*

有关指针的介绍,请参阅this tutorial


P.S。您的程序还会显示未定义的行为,因为标识符Height__Maskm_是为实现保留的。

答案 1 :(得分:2)

一个问题是:

#define NO-EXTER

这定义了一个值为NO的宏-EXTER。编译器需要宏名称和定义之间的空格。

写一下:

#define NO -EXTER

或:

#define NO_EXTER

另一个问题是您对main()的定义:

snow main(snow args, byteUendedLin**LOC[])

转换typedef时,相当于:

int main(int argc, char **argv[])

但标准要求:

int main(int argc, char **argv)

int main(int argc, char *argv[])

或使用你的typedef和变量名:

snow main(snow args, byteUendedLin **LOC)