2

Cヘッダーファイルの場合、次のようなヘッダーファイルが複数含まれるのを防ぐことができます。

#ifndef MY_FOO_H
#define MY_FOO_H

[...]

#endif

include()同じファイルへの複数のマクロ呼び出しによってコンテンツが1回だけ含まれるように、m4で同じことを行うにはどうすればよいですか?

具体的には、マクロの使用を伴うifdefガードを実行したいと思います(コードを'schangequoteで乱雑にしないでください)。dnl

もともと、私が次のことをしたとき、複数の包含はまだ引用符を破壊します:

changequote_file.m4:

ifdef(my_foo_m4,,define(my_foo_m4,1)
changequote([,])
)

changequote_invocation.m4:

include(changequote_file.m4)
After first include invocation:
[I should not have brackets around me]
`I should have normal m4 quotes around me'
include(changequote_file.m4)
After second include invocation:
[I should not have brackets around me]
`I should have normal m4 quotes around me'

m4 changequote_invocation.m4利回りで呼び出されます:

After first include invocation:
I should not have brackets around me
`I should have normal m4 quotes around me'


After second include invocation:
[I should not have brackets around me]
`I should have normal m4 quotes around me'
4

2 に答える 2

6

cpp最も簡単な方法は、バージョンのほぼ直訳です。

ifdef(`my_foo_m4',,`define(`my_foo_m4',1)dnl
(rest of file here)
')dnl

したがって、my_foo_m4が定義されている場合、ファイルは何も展開されません。それ以外の場合、その内容が評価されます。

于 2011-03-17T23:26:31.753 に答える
2

私はあなたの中に実際に2つの質問があると思います:-それを行う方法-私の場合、なぜそれが機能しないのですか?

それを行う方法はほとんどあなたがしたのと同じですが、あなたはすべてを引用する必要があります

ifdef(`my_foo_m4',,`define(`my_foo_m4',1)
  changequote([,])
')

問題は、ファイルを2回目に含めるときに見積もりが変更されたため、理論的には次のファイルを含める必要があります(見積もりをに変更した[ため、]これから含めるすべてのファイルで使用する必要があり[ます]。 ?):

ifdef([my_foo_m4],,[define([my_foo_m4],1)
  changequote([[],])
])

ただし、元の引用符と同じファイルを含めるため、Youw ifdefはシンボル`my_foo_m4'(おそらく無効)my_foo_m4 にあり、elseビットにはありません

define(`my_foo_m4',1)
  changequote([,])

引用符で囲まれていない([]の間ではない)ため、テストの結果が何であれ評価されます。つまり、changequoteをで呼び出します,。つまり、

changequote(,)

見積もりを無効にします。

于 2013-10-10T15:54:20.963 に答える