2

#ifndefacファイルの先頭に置くことは可能ですか? 基本的に、プログラムの実行時に特定のプリプロセッサ定数が宣言されているかどうかを確認する必要があり、それに応じてプログラムが変更されます。

が引数として追加されているかどうかを確認する必要があり-D DESCENDING_ORDER=1ます (指定された値は関係ありません)。

メインの c ファイルの先頭に次のコードがあります。

#ifndef DESCENDING_ORDER
int ascending = 1;
#else
int ascending = 0;
#endif

単独でコンパイルすると機能しますが、Makefile を使用してコンパイルしようとするとエラーが発生しint ascending = 1ます。

ありがとう。

編集 - Makefile コードを追加

CC=gcc
CFLAGS=-g -Wall
INC=-include
RES_OBS=res.o
LIBS=
all: res

res:    $(RES_OBS)

    $(CC) $(CFLAGS) -o res $(RES_OBS) $(LIBS) $(INC) res.h -D DESCENDING_ORDER=1

clean:
        rm -f *.o

clobber:
        make clean
        rm -f res

$(INC)....DESCENDING_ORDER=1コマンドの最後に推測して追加したようなものなので、おそらくそれが機能していない理由です。makefileなしで使用しているコマンド:

gcc res -include res.h -D DESCENDING_ORDER=1

-include res.hEDIT 2 - さまざまな引数で少し遊んで、コマンドで削除すると同じエラーが発生することがわかりました。Makefile でヘッダー ファイルを正しく参照する方法がまだわかりませんか? res.c ファイルに を追加しました#include "res.h"が、それでもエラーが発生します。

4

2 に答える 2

3

あなたのMakefilesince $(CLAGS)should beにタイプミスがあります$(CFLAGS)make特に実行すると、それらを使用するための多くmake -pの組み込みルールが表示されます (たとえば、 andなどのmake使用を検討してください)。$(COMPILE.c)$(LINK.c)

コンパイラからのすべての警告が必要なため、に追加-Wallすることを忘れないでください。CFLAGSおそらくデバッグ情報も必要なので、追加しgてください。

Linux では、-s を実行してデバッグするためにリメイクを使用することをお勧めします。これは非常に役立ちます。Makefileremake -x

標準的な慣行は次のとおりです。

  • に渡すの-includeを避け、代わりに、関連するソース ファイルの先頭近くにgcca を追加します。#include "res.h"*.c

  • -Dを定義済みのシンボルに接着します。-DDESCENDING_ORDER=1

  • Makefile関連するオブジェクト ファイルへの依存関係を新しく#include-d ファイルに追加しますres.h。これらの依存関係は自動的に生成される可能性があることに注意してください(たとえば、などに渡すことにより... -MDgcc

  • パススルー-DDESCENDING_ORDER=1 またはCFLAGSそれ以上CPPFLAGS

プログラム引数の順序が重要であることを忘れないでくださいgcc

補遺

を使用しres.iてソースコードの前処理された形式を生成したい場合があり、次のようなルールを持つことができますres.cgcc -C -E

  res.i: res.c res.h
           $(CC) -C -E $(CFLAGS) $(CPPFLAGS) $^ -o $@

次に、make res.iエディタまたはページャー (おそらくless) を使用して、プリプロセッサの出力を調べますres.i。または、コマンドラインでそれを行います

  gcc -C -E -I. -DDESCENDING_ORDER=1  res.c | less

生成された行情報を削除して行うことができます

  gcc -C -E -I. -DDESCENDING_ORDER=1  res.c | grep -v '^#' > res_.i
  gcc -Wall -c res_.i

ポイントは、Cでの前処理はテキスト操作であり、前処理された形式が間違っているということです。

ところで、ごく最近の Clang/LLVM (バージョン 3.2) または GCC (リリースされたばかりのバージョン 4.8) コンパイラでは、前処理に関するより優れたメッセージが表示されます。

于 2013-03-23T08:10:37.970 に答える
0

コードは問題ありません。Makefile を使用しているときに発生するエラーは、何か他のものと関係があります ( Makefile の前にあるもの#ifndefと Makefile を確認しないと、確認するのは困難です)。

于 2013-03-23T07:46:03.383 に答える