我是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
答案 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
。无论如何,它应该是大写的。