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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bswrap
記事: 4
登録日時: 1年前

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

#1

投稿記事 by bswrap » 1年前

初めて質問させていただきます。

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

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

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

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

アバター
あたっしゅ
記事: 667
登録日時: 14年前
住所: 東京23区
連絡を取る:

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

#2

投稿記事 by あたっしゅ » 1年前

東上☆海美☆「
貴方が本当にやりたいことは

#define XXX *(p->func_addr)

じゃないの ?

typedef unsigned int uint;

とかと、順番が混乱してない ?
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

bswrap
記事: 4
登録日時: 1年前

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

#3

投稿記事 by bswrap » 1年前

レスありがとうございます。

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

アバター
あたっしゅ
記事: 667
登録日時: 14年前
住所: 東京23区
連絡を取る:

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

#4

投稿記事 by あたっしゅ » 1年前

東上☆海美☆「
ソースの *(p->func_addr) を YYY に置換して

コード:

#define ZZZ
#ifdef ZZZ
  #define YYY *(p->func_addr)
#else
  #define YYY XXX
#endif
#define ZZZ されているか、否か、で切り替える。
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

bswrap
記事: 4
登録日時: 1年前

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

#5

投稿記事 by bswrap » 1年前

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#6

投稿記事 by みけCAT » 1年前

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 を処理する独自の処理プログラムを開発し、使用するのがいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

bswrap
記事: 4
登録日時: 1年前

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

#7

投稿記事 by bswrap » 1年前

ありがとうございます。

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

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

アバター
あたっしゅ
記事: 667
登録日時: 14年前
住所: 東京23区
連絡を取る:

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

#8

投稿記事 by あたっしゅ » 1年前

東上☆海美☆「
#4> ソースの *(p->func_addr) を YYY に置換して

は、

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

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


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

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


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

上司の命令なんですか ?
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

naohiro
記事: 8
登録日時: 2年前

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

#9

投稿記事 by naohiro » 1年前

#define は、左側の文字列を、右側の文字列に置き換えるという所をするため、
本来は使うべきではありません。

返信

“C言語何でも質問掲示板” へ戻る