2

对于 C 头文件,您可以防止包含多个头文件,例如:

#ifndef MY_FOO_H
#define MY_FOO_H

[...]

#endif

如何在 m4 中做同样的事情,include()以便对同一文件的多个宏调用只会导致内容被包含一次?

具体来说,我想做一个涉及使用宏的 ifdef 保护changequote(我不会用dnl's 弄乱我的代码):

最初,当我执行以下操作时,多个包含仍然会破坏引号:

更改quote_file.m4:

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

更改quote_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([,])
')

问题是您第二次包含该文件时,引用已更改,因此您理论上应该包含以下文件(您已将引用更改为[]因此您从现在开始包含的所有文件都应该使用[]不是吗? ?):

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 回答