鱼C论坛

 找回密码
 立即注册
查看: 1459|回复: 4

[已解决]TCPL中关于structures and functions那一节

[复制链接]
发表于 2018-10-27 09:35:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
上面举例的几个structures我都试了一下,然后有个地方编译的话会有错误。。

#include <stdio.h>

struct Point
{
    int x;
    int y;
};

struct Rect
{
    struct Point pt1;
    struct Point pt2;
};

//正确
struct Point makepoint(int x,int y)
{
    struct Point temp;
    temp.x = x;
    temp.y = y;
    return temp;
};

//错误,但如果像上一个struct一样在addpoint前面加上Point的话就没报错。
struct addpoint(struct Point p1,struct Point p2)
{
    p1.x += p2.x;
    p1.y += p2.y;
    return p1;
};

所以为什么会这样。。
error: expected identifier or '(' before 'struct'.
最佳答案
2018-10-27 10:12:08
本帖最后由 风过无痕丶 于 2018-10-27 10:19 编辑

struct 是个关键字,Point 才是一个数据类型  返回一个struct 你让编译器怎么办, 这个struct 是多大的内存空间,有些什么成员, 它都不知道。。 你让它怎么办,只有给你报错啊。。

或许你还可以这样写

#include <stdio.h>

typedef struct Point{
    int x;
    int y;
}POINT;   // 加个typedef关键字 给结构体取个别名

struct Rect{
        POINT pt1;
        POINT pt2;
};

POINT makepoint(int x, int y){
        POINT temp;
    temp.x = x;
        temp.y = y;  
    return temp;
};


POINT addpoint(POINT p1, POINT p2){

        p1.x += p2.x;
        p1.y += p2.y;
  return p1;
};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-27 10:12:08 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕丶 于 2018-10-27 10:19 编辑

struct 是个关键字,Point 才是一个数据类型  返回一个struct 你让编译器怎么办, 这个struct 是多大的内存空间,有些什么成员, 它都不知道。。 你让它怎么办,只有给你报错啊。。

或许你还可以这样写

#include <stdio.h>

typedef struct Point{
    int x;
    int y;
}POINT;   // 加个typedef关键字 给结构体取个别名

struct Rect{
        POINT pt1;
        POINT pt2;
};

POINT makepoint(int x, int y){
        POINT temp;
    temp.x = x;
        temp.y = y;  
    return temp;
};


POINT addpoint(POINT p1, POINT p2){

        p1.x += p2.x;
        p1.y += p2.y;
  return p1;
};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-27 14:53:29 | 显示全部楼层
风过无痕丶 发表于 2018-10-27 10:12
struct 是个关键字,Point 才是一个数据类型  返回一个struct 你让编译器怎么办, 这个struct 是多大的内存 ...

有点明白了。。
所以下面两个结构(makepoint和addpoint)是作为函数来调用,然后由于return的是POINT,因此前面要加上整个struct point(就是POINT)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-27 16:16:52 | 显示全部楼层
观察楼主写代码的风格,应该是有其他语言基础的,或者是学这语言的时候有一个很好的老师带的,
所以应该是想深入了解一下为什么报这些提示;

鉴于很多编译器都支持C99标准,为了想通这个问题,那我们先来看看C99标准

auto        break        case        char        const        continue        default
do        double        else        enum        extern        float        for        goto
if        inline        int        long        register        restrict        return
short        signed        sizeof        static        struct        switch        typedef        union        unsigned
void        volatile        while        _Bool        _Complex        _Imaginary
The above tokens (case sensitive) are reserved (in translation phases 7 and 8) for use as keywords,
and shall not be used otherwise.
//保留(在编译时期 7 和 8)以上这些标记(区分大小写)用作关键字, 且不应该挪为他用;

所以,从以上表述可以看出,struct是要被解释为关键字的,所以当遇到struct编译器将它看成一个关键字,
而通过struct关键字的语法知道,后面应该需要一个标识符(identifier),但是当扫描到"addpoint("这里,
发现这不是一个标识符(C中标识符不允许有'(',可以参考相关C基础书籍),所以expected identifier出现了.
至于后面的or  '(' before 'struct'. 的产生,在VS里报的是缺少')',这就看具体编译器了,但大概可以这么
推测,因为扫描到addpoint(这个左括号的时候将这整个字符串判给前面的struct,跳过了这个'(',当遇到最后
一个')'的时候发现并没有'('与之匹配,所以报了这样的错.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-27 18:02:11 | 显示全部楼层
回访三生 发表于 2018-10-27 16:16
观察楼主写代码的风格,应该是有其他语言基础的,或者是学这语言的时候有一个很好的老师带的,
所以应该是想 ...

Wow...原来这样,突然对于分析error和warning有了点启发,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-2 20:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表