2013-01-12 92 views
0

我是C的新手(如2天前开始),由于语法的原因我有编译问题,但是我从gcc获得的错误消息对我帮助不大。我汇编如下:gcc -ansi -Wall -pedantic line.c编译错误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

什么是'line2d'的定义? – fge

+2

[WorksForMe](http://liveworkspace.org/code/4yQFKj$0)...请提供您的代码和编译过程的更多细节。 – Mankarse

+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,避免整个名称冲突问题彻底。

+3

你的回答是正确的,但'___ LINE__H ___'是一个非常糟糕的选择。以两个下划线或下划线和大写字母开头的标识符保留供实施使用。使用'LINE_H'或类似的东西。 –

+1

为什么-1?这是正确的答案。 – Inisheer

+0

啊。谢谢。我知道了。我确实看到定义必须是'#ifndef symbol name' – Andrew

2

你在头部完成了#define line - 所以预处理器用“”(无)替换line

所以你的C代码:

.x1=1; 

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

相关问题