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 に答える