2017-06-13 14 views
-1

数値をCのキーワード型にマップしようとしています。数値に型をマッピングするCマクロプリプロセッサ

#include <stdio.h> 
#include <stdlib.h> 
#include "memory.h" 

#define DOUBLE_TYPE 1 
#define INT_TYPE 2 

#define OBJECT_TYPE(Y) 
     #if Y == DOUBLE_TYPE \ 
       double \ 
     #elif Y == INT_TYPE \ 
       int \ 
     #else \ 
       int \ 
     #endif \ 

int main(int argc, char* argv[]) { 
     unsigned int type = 1; 
     OBJECT_TYPE(type) value = 0.5f; 
     printf("%f\n", value); 

     return 0; 
} 
test.c:11:3: error: missing binary operator before token "double" 
    double \ 

私は、整数コードによって知られている特定のタイプにvoid*をキャストすることができるようにしたいです。

+0

C **前**プロセッサがデータ型の概念がありません。ディレクティブをネストすることはできません。そしてCは静的に型付けされています。あなたが試したことは意味をなさない。それはXY問題です。あなたは何を解決したいですか? – Olaf

+0

プリプロセッサはコンパイル時のもので、実際のコンパイルが行われる前に別のフェーズで実行されます。プリプロセッサはそれ自身の別の言語を使用し、C変数の概念を持たない。 –

+0

さらに、 'default'型のようなものはありません。 –

答えて

2

マクロではできません。それらはコンパイル時のテキスト置換だけを行い、必要なものは実行時の値に依存します。

あなたが効果的にバリアント型の変数を持つようにしたい場合は、使用union

struct var_type { 
    int type; 
    union { 
     int i; 
     double d; 
    } value; 
}; 

int main(int argc, char* argv[]) { 
    struct var_type value = { DOUBLE_TYPE, { d = 0.5f }}; 

    switch (value.type) { 
    case DOUBLE_TYPE: 
     printf("%f\n", value.value.d); 
     break; 
    case INT_TYPE: 
     printf("%d\n", value.value.i); 
     break; 
    default: 
     printf("%d\n", value.value.i); 
     break; 
    } 

    return 0; 
} 
+0

void *を、整数コードで知られる特定の型にキャストできます。 –

+0

できません@eat_a_lemon – tilz0R

+0

@eat_a_lemon次に、タイプをチェックして、そのタイプにキャストします。 – dbush

関連する問題