2016-04-06 5 views
2

DEBUGが定義されている関数の1つが宣言されているヘッダーがあります。#includeはプログラムに表示されるよりも早く要求されます

また、私は同じ原理で動作するこの関数の定義を持っています。しかし、DEBUGが引数チェックの後にmain()にのみ定義されているかどうかはわかります。

Iが配置した#includemain()で:

ヘッダ:

#ifdef DEBUG 
void printStack(Stack* st); 
#endif 

ファイル)(主にある関数定義は

#ifdef DEBUG 
void printStack(Stack* st) 
{ 
    int i; 
    for (i = 0; i < st->size; i++) 
     printf(ValType_IOSPECIF " ",st->data[i]); 
    printf("\n"); 
} 
#endif 

ファイルであります

#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include "calculating.h" 

#define EXPR_LENGTH 1000 

int main(int argc, char* argv[]) 
{ 
    int argflag = 0; 
    if (argc >= 2) 
     argflag = !strcmp(argv[1], "-debug"); 

#if (argflag) 
#define DEBUG 
    printf("! DEBUG !\n\n\n") 
#endif 

#include "stack.h" // there is a that function here 
... 
} 

それは正しいですか?

+0

"関数のうちの1つがDEBUG" --Noの場合に宣言し、 'DEBUG'が定義されている場合に関数が定義されます。そして、このマクロをコマンドラインから渡し、コード内で定義しないでください。そして、一般的には関数全体を除外することは悪い考えです。そうすれば、関数がなくてもコンパイルできなくなるからです。 – Olaf

+0

'gcc -E main.c'を実行し、結果が –

答えて

4

あなたがCプリプロセッサマクロを混乱している:#始まる

すべては、ソースコードがコンパイルされる前に、プリプロセッサによって置き換えられ、実行時にのみ実行mainがありますされています。

だから、あなたは正しいことをしていません。

実行時に#defineまたは#ifを使用することはできません。それは事前コンパイル時のものです。単にCの通常の変数とif制御機構を使用してください。

あなたの間違いは、コヒーレントなチュートリアルやCの本を習得しないことを強く指摘します。多分あなたは新しい文学を拾いたいと思うかもしれません。私が想像することができるCチュートリアルは、これをかなり早く行う方法を教えてくれるでしょう。

4

しかし、DEBUGが引数チェックの後でmain()にのみ定義されているかどうかはわかります。

...

それは正しいですか?

いいえ、それは正しくありません。

DEBUGは、各ソースファイルをコンパイルするときにコンパイル時に定義されるか、されないプリプロセッサマクロです。 main.cをコンパイルするときにDEBUGが定義されている可能性がありますが、printStackを定義するソースファイルをコンパイルするときは定義できません。

makeまたはIDEを使用する場合は、すべてのソースファイルをコンパイルするためにDEBUGが定義されているかどうかは確かですが、保証するものは何もありません。

+0

IIRCであることを確認します。これは' NDEBUG'マクロです。 'DEBUG'が実際にサポートされているかどうか確かめてください。 – Olaf

+0

@Olafでは、標準は 'assert'に関連して' NDEBUG'について述べています。私は、「NDEBUG」とは関係のない「DEBUG」についてOPが疑問に思います。 –

+0

ええと、私は彼が実際に「NDEBUG」のような何かについて考えていると思うが、その名前を混乱させるか、ちょうどヒアシーに従う。 – Olaf

0

いいえ、間違っています。渡された引数に基づいて前処理の結果を判断しようとしています。ここにあなたのコードの簡易版は、次のとおりです。

clang -E main.cで前処理
#define EXPR_LENGTH 1000 

int main(int argc, char* argv[]) 
{ 
    int argflag = 0; 
    if (argc >= 2) 
     argflag = !strcmp(argv[1], "-debug"); 

#if (argflag) 
#define DEBUG 
    printf("! DEBUG !\n\n\n") 
#endif 
} 

int main(int argc, char* argv[]) 
{ 
int argflag = 0; 
if (argc >= 2) 
    argflag = !strcmp(argv[1], "-debug"); 





} 

プロセスが実行前でコンパイル、前に終了し、起動します。したがって、実行時に前処理の結果を判断することは不可能です。

関連する問題