0

我是 C 的新手(就像 2 天前开始的那样),由于语法问题,我遇到了编译问题,但我从 gcc 收到的错误消息对我没有多大帮助。我编译如下:gcc -ansi -Wall -pedantic line.c

整件事是我 101 课的一个简单的介绍性练习。这些值只是相互测试,以确保它们在 line_test.c 文件中正确分配。但在我解决那个人的编译问题之前,我需要解决这个文件。

这是我的代码:

#include "line.h"

struct line2d create_line2d (double x1, double y1, double x2, double y2) {
    struct line2d line;
    line.x1=1;
    line.y1=2;
    line.x2=3;
    line.y2=4;
    return line;
}

和 line.h 代码:

#ifndef line
#define line

struct line2d {
    double x1;
    double y1;
    double x2;
    double y2;
};

struct line2d create_line2d(double x1, double y1, double x2, double y2);

#endif

这是它抛出的错误

line.c: In function ‘create_line2d’:
line.c:5: error: expected expression before ‘.’ token
line.c:6: error: expected expression before ‘.’ token
line.c:7: error: expected expression before ‘.’ token
line.c:8: error: expected expression before ‘.’ token
line.c:9: warning: ‘return’ with no value, in function returning non-void
4

2 回答 2

9

在你定义为空的头文件line中。在 C 文件中,您使用它,预处理器将单词的每个实例都替换为line空。所以基本上,你正在尝试编译:

struct line2d create_line2d (double x1, double y1, double x2, double y2) {
    struct line2d line;
    .x1=1;
    .y1=2;
    .x2=3;
    .y2=4;
    return ;
}

显然,这是行不通的:)

您应该始终使用一些不会在其他任何地方使用的字符串作为#ifdef警卫。像这样的东西LINE__H___会是更好的选择。

#ifndef LINE__H___
#define LINE__H___

struct line2d {
    double x1;
    double y1;
    double x2;
    double y2;
};

struct line2d create_line2d(double x1, double y1, double x2, double y2);

#endif//!LINE__H___

在通用编译器的更新版本中,您可以完全使用#pragma once并避免整个名称冲突问题。

于 2013-01-12T00:58:54.390 回答
2

你已经#define line在你的标题中完成了 - 所以预处理器替换line为“”(什么都没有)。

所以你的C代码是:

.x1=1;

可能最好的事情是让包含保护定义一些更独特的东西:INCLUDE_GUARD_LINE_H也许。无论如何,它应该是大写的。

于 2013-01-12T01:00:51.217 回答