这个问题已经有一个答案在这里:

考虑本(可怕,太可怕了,不好,非常糟糕)代码结构:

#define foo(x) // commented out debugging code

// Misformatted to not obscure the point
if (a)
foo(a);
bar(a);

我已经看过两个汇编人员预处理器产生不同的结果,在这个代号:

if (a)
bar(a);

if (a)
;
bar(a);

显然,这是一件坏事的用于便携式码的基础。

我的问题:什么是预处理应该做这个?省略掉的评论的第一或扩大的宏第一?

有帮助吗?

解决方案

不幸的是,原来的 ANSI C的规范 具体地排除了任何预处理器特征的第4节("本说明中介绍的只有C语言。它没有规定对于无论是图书馆或预处理器。").

C99说明书 处理这一明确,虽然。该意见被替换为一个单一的空间,在"翻译阶段",这种情况发生前进行预处理指令的分析。(第6.10节)。

VC++GNU C编译器 都遵循这一范例的其他汇编者不可兼容的,如果他们年纪大了,但如果它是C99柔顺的,你应该是安全的。

其他提示

作为描述 这个复制-n-粘贴能解密 翻译阶段C99标准,消除意见(他们是替换由一个单一的空白)发生在翻译第3阶段,同时预处理指令的处理和宏扩大在相4.

在C90标准(其中我只有硬拷贝,因此没有副本-n-粘贴)这两个阶段出现的顺序相同,虽然所描述的翻译阶段稍有不同,在某些细节从C99标准-事实上,意见是删除和替换由一个单一的空白字之前预处理指令的处理和宏扩大不是不同的。

再次的,C++的标准具有这2阶段发生在相同的顺序。

如何'// 意见应该加以处理,C99标准说这个(6.4.9/2):

除了在符恒定的,一串的文字,或评论,符// 引入一个注释,包括所有多人物,但不包括 下一个新的线性。

和C++标准(2.7):

字符//开始一个评论,其终止与未来新行 符。

所以你的第一个例子显然是错误的那部分翻译的-';'字后 foo(a) 应当保留当 foo() 宏扩展的评论字不应当一部分的"内容"的 the foo() 宏。

但因为你在面临着越野车翻译,你可能想要改变宏观定义为:

#define foo(x) /* junk */

要解决这一错误。

但是(与我漂流离题在这里...),由于行拼接(反斜杠,只是前一个新的线)之前发生的意见进行处理,可能会遇到这样的事情位的讨厌的代码:

#define evil( x) printf( "hello "); // hi there, \
                 printf( "%s\n", x); // you!



int main( int argc, char** argv)
{
    evil( "bastard");

    return 0;
}

这可能会吃惊的是谁写的。

或者更好的是,尝试下,编写通过人(当然不是我!) 谁喜欢框式的评论:

int main( int argc, char** argv)
{
                            //----------------/
    printf( "hello ");      // Hey, what the??/
    printf( "%s\n", "you"); // heck??         /
                            //----------------/
    return 0;
}

这取决于是否编译器违约的处理 对三字符组 或者没有(的编译器是应该的,但由于对三字符组的惊讶几乎每一个人跑过他们,某些编译器的决定关闭它们通过默认),则可能或不可能得到你想要的行为-什么行为,是的,当然。

根据 MSDN, 意见取代一个单一的空间标记阶段, 这种情况发生前进行预处理阶段的宏扩大。

从来没有把//评论在你的宏。如果你必须把评论意见,使用/**/.此外,还有一个错误的宏:

#define foo(x) do { } while(0) /* junk */

这种方式,foo始终安全使用。例如:

if (some condition)
    foo(x);

将永远不会扔一个编译错误,无论是否foo定义的一些表达。

#ifdef _TEST_
#define _cerr cerr
#else
#define _cerr / ## / cerr
#endif
  • 会工作的一些编(VC++).时 _TEST_ 是不是定义,

    _cerr...

    将替换意见的线

    //cerr...

我似乎回想一下,遵约需要三个步骤:

  1. 扩大宏
  2. 条次

为此原因,与编译器能够接受。我有文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top