2017-01-18 7 views
0

私は周りをチェックしようとしましたが、答えが見つからないようです。intがマクロとして定義されているかどうかを確認します。 C

私はいくつかのCコードを書いていますが、int iがマクロとして定義されているかどうかを知りたいと思います。たとえば、forを実行すると、カウンタがマクロかどうかがチェックされます。私は、次のを作ってみたが、私は、コンパイル時にそれは私に警告を与えるので、私は

for(int i = 1; i < 25; i++){ 
    #define DEFINED 1 
    #ifndef i 
    #define DEFINED 0 
    #endif 
    int a = DEFINED; 
    if(a){ 
     bla bla 
    } 
} 

はそんなにありがとうその不正なコードを想定しています。

+1

*多くのエラーが発生します*。 **特に**どのようなエラー? – dbush

+7

これはXYの問題のようです。なぜあなたはそれをしたいのですか? http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem –

+0

実際には、私はマクロを再定義する警告を意味しました。なぜ私は多くを書いたのか分かりません。警告は1つのみです。 – InstaFjelle

答えて

3

短い答え:iをプリプロセッサ式の条件として使用することはできません。それが定義されているかどうかを確認することさえできません。

長い回答:前処理は初期の翻訳段階の1つです。コードがコンパイルされる前にも起こります。 iの値は、実行時にのみ使用できます。プログラムがコンパイルされ、リンクされ、実行された後の意味。 2つの段階はできるだけ離れています。

シンボルiは、コンパイル段階でのみ(プリプロセッサの実行が終了した後)変数として認識されるため、i変数が定義されているかどうかを確認することはできません。

プリプロセッサでは条件付きでコードをコンパイルできますが、それ以降の変換段階でしか認識されないものに対しては条件を設定することはできません。

+0

ありがとうございます。 これは、変数マクロが定義されているかどうかを確認する方法がないことを意味しますか? – InstaFjelle

+0

@InstaFjelle - マクロと変数は2つの非常に異なるものです。私はあなたが[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)を持っているという概念を2番目に始めています。私はあなたが解決策であると考えるものの代わりに、あなたの問題について別の質問をすることをお勧めします。 – StoryTeller

+0

'#ifdef'は、マクロが定義されているかどうかをチェックします。もしそれがあなたが望むものでなければ、もっと明確に説明する必要があります。 – TripeHound

0

警告が表示される理由は、iが定義されていない場合にDEFINEDを再定義するためです。このマクロはすべて#if内に定義する必要があります。

#ifndef i 
#define DEFINED 0 
#else 
#define DEFINED 1 
#endif 
0

プリプロセッサはC.が#error#pragmaなどの特別なディレクティブがなければ、「知らない」、それははるかに単なるテキスト置換システムです。

#if((n)def)と宣言されたマクロは、#defineキーワードのプリプロセッサでのみ動作します。 int iのようなCの変数はマクロではありません。

はあなたに良いアイデアを与えるために:それは実際にコンパイルされる前

#include <stdio.h> 

#define MYFORLOOP for(i = 0; i < 25; i++) 

int main() 
{ 
    int i; 
    int data[25]; 
    MYFORLOOP 
    { 
     data[i] = i; 
    } 

    MYFORLOOP 
    { 
     printf("%d\n", data[i]); 
    } 
    return 0; 
} 

コードが、その後前処理されているので、コンパイラは、実際に「見る」ものです:

// < The contents of stdio.h, including any headers it includes itself > 

int main() 
{ 
    int i; 
    int data[25]; 
    for(i = 0; i < 25; i++) 
    { 
     data[i] = i; 
    } 

    for(i = 0; i < 25; i++) 
    { 
     printf("%d\n", data[i]); 
    } 
    return 0; 
} 

理由#ifdef iだろう変数i#defineマクロではないために失敗します。

関連する問題