用#和_line_创建C宏(标记与宏连接)

用#和_line_创建C宏(标记与宏连接)

我想要创建一个C宏,它根据行号创建一个具有名称的函数。我想我可以这样做(真正的函数在大括号中有语句):

#define UNIQUE static void Unique_##__LINE__(void) {}

我希望能扩展到:

static void Unique_23(void) {}

那不管用。通过令牌连接,定位宏将按字面处理,最后扩展到:

static void Unique___LINE__(void) {}

这能做到吗?

(是的,有一个真正的理由我想这样做,不管这看起来多么无用)。


慕雪6442864
浏览 501回答 2
2回答

jeck猫

GCC不需要“包装”(或实现),除非结果需要“串”。GCC有一些特性,但所有这些功能都可以用普通的C版本1来完成(一些人认为伯克利4.3 C的速度要快得多,值得学习如何使用)。*Clang(Llvm)没有正确地为宏扩展做空白-它增加了空白(这肯定会破坏C标识符作为进一步预处理的结果)*,clang只是不做#或*宏扩展,因为C预处理程序在未来几十年内都会这样做。主要的例子是编译X11,宏“Concat 3”被破坏,它的结果现在被错误命名为C标识符,这当然无法构建。我开始发现建造失败是他们的职业。我认为这里的答案是“违反标准的新C是坏的C”,这些黑客总是选择(破坏名称空间)-他们无缘无故地更改默认值,但实际上并没有“改进C”(除了他们自己说的那样:我说这是为了解释为什么他们逃脱了所有尚未有人让他们负责的破坏)。这并不是早期的C处理器不支持的问题。Uniq_()_因为它们支持#实用化,它允许“代码中的编译器品牌Hackery被标记为hackery”,并且在不影响标准的情况下也能很好地工作:就像更改默认值是无用的winton破坏一样,就像更改函数在使用相同名称时所做的一样(命名空间破坏)是.恶意软件在我看来
打开App,查看更多内容
随时随地看视频慕课网APP