2012-05-04 6 views
-1

Cが選択#defineを設定できるかどうか疑問に思っていました。ここ は、私は、選択によって何を意味するかです:C selective #define

typedef struct mystruct{ 
int (*pointer_function)(struct mystruct* ,struct mystruct); 
... 
} mystruct; 

// and I have: 
int main() { 
mystruct s1, s2; 
// when I do: 
s1 = s2; 
// I want my #define to recognize that on the left side 
// I have mystruct type and use s1.pointer_function(&s1,s2); 
} 

答えて

0

の#defineは、単純な文字列置換を実行します。私は定義された構造を有している 場合。コンテキスト依存ではありません。あなたはこれをすることはできません。

0

定義するシンボルがわからない場合は、s1またはs2です。それは本当に重要なことではありません。いずれの場合でも、必要な名前の1つを置き換えると、うまくいきません。

0

これはC11で、_Genericの構文で行うことができます。

#define MY_MACRO(x, y) _Generic((x), \ 
    mystruct: (x).pointer_function(&(x), (y)), \ 
    ) 

これはC99またはC89では実行できません。まともなC11サポートのあるコンパイラについてはまだ分かりませんので、このコードはまだ1年または2年はコンパイルされません。 GCCドキュメント(source)から:2011:

GCCは-std = C11又はiso9899 = -stdで有効この規格の部品の不完全なサポートは、制限されています。