2017-03-12 6 views
0

マクロの助けを借りてコンパイル時(実行時ではない)に構造体にアクセスしたいと思います。たとえば、独自の16進コードと応答の長さを持つ多数のコマンドがあります。ですから、私はプリプロセッサを使って1つの名前で別の値にアクセスする必要があります。コンパイル時に構造体を持つ

と言って、コマンドはREAD_SOMETHING_FROM_THAT_PLACEという名前で、0xABというコードと7個の応答バイトを返します。代わりに1つのインスタンスの両方にアクセスするために、より便利かつ堅牢になり

#define READ_SOMETHING_FROM_THAT_PLACE_CODE 0xAB 
#define READ_SOMETHING_FROM_THAT_PLACE_LEN 7 

本研究は、次のような二つの定義の使用を避けることを意図しています。それは可能です

CODE(READ_SOMETHING_FROM_THAT_PLACE)と、プリプロセッサは私に0xAB

を与える

LEN(READ_SOMETHING_FROM_THAT_PLACE)と、プリプロセッサは私に7

を与えるだろう:私は、それが(種類の)のようなマクロによってアクセスすることができると思います?どうやってするの?おかげさまで

+1

構造体を作成して各マクロのフィールドを取得しますが、マクロを実際に必要としないことがあります。 –

+1

あなたは何かをする方法がわからなくても、コードの説明の代わりにコードを掲示すれば、あなたの質問がもっとはっきりします。 – StoryTeller

+0

[XY問題](https://meta.stackexchange.com/q/66377/142198)のように聞こえます。 –

答えて

1

コマンドを格納する構造体を作成します.2つのフィールドに1つのコードがあり、もう1つは長さirの戻り値です。それであなたは自分のアイデアであっても正直には見えません良いアイデア、または少なくとも必要ではありません。おそらく、このような

は、

#include <stdio.h> 

#define CODE(cmd) (commands[cmd].code) 
#define LEN(cmd) (commands[cmd].length) 

struct command { 
    unsigned char code; 
    int length; 
}; 

enum { 
    Read = 0 
}; 

static const struct command commands[] = { 
    [Read] = {0xAB, 0x07} 
}; 

int 
main(void) 
{ 
    fprintf(stdout, "0x%02X, %d\n", CODE(Read), LEN(Read)); 
    return 0; 
} 

良い方法が考えられるが、あなたは今の機能を持つことができ、この

#include <stdio.h> 

struct command { 
    unsigned char code; 
    int length; 
}; 

struct commands { 
    struct command read; 
    struct command write; 
    /* More commands */ 
}; 


static const struct commands table = { 
    .read = {0xAB, 0x07} 
}; 

int 
main(void) 
{ 
    fprintf(stdout, "0x%02X, %d\n", table.read.code, table.read.length); 
    return 0; 
} 

のように、フィールドなど、あなたのコマンドを使用して、他の構造を伴うだろう

unsigned char *execute(const struct command *const cmd); 

とし、それを,

unsigned char *response = execute(&table.read); 

は、あなたがして、コマンドを実行するための汎用的なインタフェースを持っており、あなたがそれらへのアクセスを持っているため、実際のcodeまたは戻り長さを心配する必要はありません。


また、同じように定義されたすべてのコマンドのためのいくつかのパラメータを持つことができます。

関連する問題