在C中编译错误:错误:在'。'标记之前的预期表达式

时间:2013-01-12 00:43:55

标签: c gcc

我是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

2 个答案:

答案 0 :(得分: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并完全避免整个名称冲突问题。

答案 1 :(得分:2)

您已在标题中完成#define line - 因此预处理程序会将line替换为“”(无)。

所以你的C代码是:

.x1=1;

最好的办法是让包含保护定义更独特的东西:INCLUDE_GUARD_LINE_H。无论如何,它应该是大写的。