【问题标题】:Commented lines in macros宏中的注释行
【发布时间】:2009-07-15 11:58:23
【问题描述】:

请帮助宏初学者...我创建了一个用于加载图像的简单宏并将其拆分为几行,以便每次执行宏生成的代码时都可以记录下来(用于调试)。它看起来像这样:

#define LOAD_PNG(L_I_IMAGE_NAME) ({ \
PngImageClass* __tmp; \
printf("Loading png: %s", L_I_IMAGE_NAME);\
__tmp = [image loading code here];\
__tmp; \
})

我的计划是能够在需要时轻松注释掉日志行(手动),但预处理器不会容忍任何正常方式。应该怎么做?!

编辑:我说它“任何正常方式”都不起作用是完全错误的,因为我懒得只尝试单行注释。我也会听取几位响应者的建议,将其变成一个函数。不,没有充分的理由(我猜)为此使用宏。

【问题讨论】:

  • 您使用宏而不是函数是否有原因?这看起来不像是一个宏是个好主意的地方。

标签: c objective-c macros


【解决方案1】:

你可以这样做:

#define LOAD_PNG(L_I_IMAGE_NAME) ({ \
PngImageClass* __tmp; \
/*printf("Loading png: %s", L_I_IMAGE_NAME);*/\
__tmp = [image loading code here];\
__tmp; \
})

单行 cmets // 根本不起作用,因为您明确要求编译器通过在每行末尾提供反斜杠 (\) 来继续行。

【讨论】:

  • 注释应该在反斜杠结束前停止;否则这些线不会拼接在一起,它们也不会全部包含在宏定义中。 (即第三行应该以“*/\”结尾而不是“*/”)
【解决方案2】:

因为宏都是一行(通过续行),所以不能在其中使用 '#if 0' 或 '//' 样式的 cmets。 /**/ 应该可以正常工作。

从您发布的 sn-p 来看,这看起来不应该是一个宏。仅当您以某种方式利用文本替换时才应使用宏(例如,需要变量和变量的名称)。

【讨论】:

    【解决方案3】:

    为什么宏语句周围有括号?一旦你解决了预处理器问题,它就不会编译,你当然不需要它。

    【讨论】:

    • 它确实可以编译,但我不记得我为什么使用它们。它要么来自我曾经复制过的某个宏,要么是测试会话混乱的结果。不记得了。我会删除括号:)
    • 这很奇怪。我尝试编译一些带有括号的代码,例如您的,但它没有编译。作为参考,我在 cygwin 上使用了 gcc 3.4.4。
    【解决方案4】:

    除了 /.../ 样式的 cmets,您还可以这样做:

    if (0) printf(...);
    

    更好的方法是不使用宏,而是将其转换为函数,除非有非常重要的理由使用宏(但您没有给出任何理由)。

    【讨论】:

    • 这完全取决于编译器。我希望任何体面的编译器都能对其进行优化,因为这是一个很明显的例子。
    • 事实上,即使没有使用任何 -O 选项,Ubuntu 上的 gcc 似乎也会对其进行优化。
    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2011-04-30
    相关资源
    最近更新 更多