ページ 11

define で括弧付きの文字列を置き換える

Posted: 2023年1月07日(土) 10:21
by bswrap
初めて質問させていただきます。

やりたいこと
括弧付きの文字列を#defineで置き換えたい。
例としては、
*(p->func_addr)
といった文字列を #define で置き換えたいです。

単純に
#define *(p->func_addr) XXX
とすると、括弧は #define A(x) ((x)+1)みたいな意味に解釈されてしまいますよね?
これを括弧含めてただの文字列としてXXXに置き換えたいです。

やり方、それは無理、無理だけどこんな代替がある、があれば教えて頂きたいと思います。

よろしくお願いいたします。

Re: define で括弧付きの文字列を置き換える

Posted: 2023年1月07日(土) 10:56
by あたっしゅ
東上☆海美☆「
貴方が本当にやりたいことは

#define XXX *(p->func_addr)

じゃないの ?

typedef unsigned int uint;

とかと、順番が混乱してない ?

Re: define で括弧付きの文字列を置き換える

Posted: 2023年1月07日(土) 11:23
by bswrap
レスありがとうございます。

いえ、元の順序であっています。
元々のCソースに *(p->func_addr)と書いてあるところを、XXXというテストスタブで
置き換えたい感じです。

Re: define で括弧付きの文字列を置き換える

Posted: 2023年1月07日(土) 12:14
by あたっしゅ
東上☆海美☆「
ソースの *(p->func_addr) を YYY に置換して

コード:

#define ZZZ
#ifdef ZZZ
  #define YYY *(p->func_addr)
#else
  #define YYY XXX
#endif
#define ZZZ されているか、否か、で切り替える。

Re: define で括弧付きの文字列を置き換える

Posted: 2023年1月07日(土) 12:49
by bswrap
あらかじめ、#define で単純に置き換えられるYYYになっていれば
切り替え可能ですが、現状 *(p->func_addr)なので
「ソースの*(p->func_addr)をYYYに置換して」の前提が無理です。
既存コードに手を入れるのはなしでいきたいので
#define で無理であれば、sed とかパイプつないで入力は手が入っていない元ソース
にしようと思います。
そこまでするなら元ソース手を入れても同じじゃんとは私も思うのですが。

Re: define で括弧付きの文字列を置き換える

Posted: 2023年1月07日(土) 13:34
by みけCAT
C言語のプリプロセッサの #define の文法は

コード:

# define identifier replacement-list new-line
または

コード:

# define identifier lparen identifier-listopt ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line
となっています。
(引用元:N1570 6.10.3 Macro replacement)
すなわち、置き換え元は識別子 (identifier) でなければなりません。
identifier は 6.4.2 Identifiers で定義されており、処理系によって使える文字を独自に増やせるともありますが、
*(p->func_addr) を識別子扱いするのは式の記述と衝突する可能性があり、さすがに無理があるでしょう。

どうしても #define を使いたいのであれば、
C言語とは関係なく独自に定義した #define を処理する独自の処理プログラムを開発し、使用するのがいいでしょう。

Re: define で括弧付きの文字列を置き換える

Posted: 2023年1月07日(土) 13:50
by bswrap
ありがとうございます。

#defineではできないこと、なぜできないか、を理解できました。

*(p->func_addr)のpの先を置き換えるか、sed等でプリ処理を作って対処します。

Re: define で括弧付きの文字列を置き換える

Posted: 2023年1月08日(日) 18:44
by あたっしゅ
東上☆海美☆「
#4> ソースの *(p->func_addr) を YYY に置換して

は、

#5> あらかじめ、#define で単純に置き換えられるYYYになっていれば
#5> 切り替え可能ですが、現状 *(p->func_addr)なので
#5> 「ソースの*(p->func_addr)をYYYに置換して」の前提が無理です。

#define を使用するのではなく、ソースコードをエディタ等で置換する、という意味で書きました。


> 既存コードに手を入れるのはなしでいきたいので
> #define で無理であれば、sed とかパイプつないで入力は手が入っていない元ソース
> にしようと思います。

『既存コードに手を入れるのは、なし』なら #define を追加するのもダメですね。


#5> そこまでするなら元ソース手を入れても同じじゃんとは私も思うのですが。

上司の命令なんですか ?

Re: define で括弧付きの文字列を置き換える

Posted: 2023年1月12日(木) 09:11
by naohiro
#define は、左側の文字列を、右側の文字列に置き換えるという所をするため、
本来は使うべきではありません。