问题标签 [macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
18 回答
39228 浏览

c - C 宏有什么用?

我已经写了一点 C 语言,我可以很好地阅读它以大致了解它在做什么,但是每次我遇到一个宏时,它都让我彻底崩溃。我最终不得不记住宏是什么,并在阅读时将其替换在脑海中。我遇到的那些直观易懂的总是像小函数一样,所以我一直想知道为什么它们不只是函数。

我可以理解需要在预处理器中为调试或跨平台构建定义不同的构建类型,但定义任意替换的能力似乎只会使已经很难理解的语言变得更加难以理解。

为什么要为 C 引入如此复杂的预处理器?有没有人有一个使用它的例子,这会让我明白为什么它似乎仍然用于#debug 样式条件编译以外的其他目的?

编辑:

阅读了许多答案,我仍然不明白。最常见的答案是内联代码。如果 inline 关键字不这样做,那么要么它有充分的理由不这样做,要么实现需要修复。我不明白为什么需要一种完全不同的机制,这意味着“真正内联这段代码”(除了在内联之前编写的代码之外)。我也不理解提到的“如果它太愚蠢而不能放入函数中”的想法。当然,任何接受输入并产生输出的代码都最好放在函数中。我想我可能没有得到它,因为我不习惯编写 C 的微优化,但预处理器感觉就像是一些简单问题的复杂解决方案。

0 投票
1 回答
584 浏览

vb.net - Visual Studio 2003,宏,Process.Attach 不总是工作

我正在使用 Visual Studio 2003,并且我有一个类似于此的宏:

第一次使用宏,它工作正常。以后的每一次,即使我从这个过程中分离出来,.Attach()似乎也没有做任何事情。

当我逐步执行宏时也会发生同样的事情......proc.Attach()在正确的过程中被调用,但没有任何反应。

注意:在“进程”窗口中查看进程时,我的进程的“类型”列显示".NET, Win32".

知道发生了什么吗?

0 投票
4 回答
2234 浏览

macros - 你能在 Emacs Lisp 宏中创建交互式函数吗?

我正在尝试在 emacs lisp 中编写一个宏来创建一些“辅助函数”。</p>

最终,我的辅助函数将比我这里的更有用。我意识到可能有更好/更直观的方法来完成同样的事情(请发布),但我的基本问题是为什么这不起作用/我做错了什么:

如果我获取宏扩展的输出并对其进行评估,我将获得我打算通过宏获得的交互式函数,但即使宏运行并且似乎正在评估,我也无法调用M-x text-nior text-swallow

0 投票
3 回答
1952 浏览

visual-studio - 类似于 String.Format 粘贴的 Visual Studio 宏

例如,我希望能够剪切/复制像“<strong>{0}</strong>”这样的字符串。

然后我想选择一些代码,例如“Hello, World”,然后调用一个宏,这将导致“<strong>Hello, World</strong>”。

你怎么能这样?

更新:我为什么要这样做?

我可以制作一个宏或快捷方式来添加特定的东西,如 <strong> 标记到选择中。但是,我的想法是动态创建任何类型的“环绕”粘贴行为。

我经常粘贴字段或属性列表。所以我从其他地方得到

举个例子,我知道我想将它们设置为

使用我的魔术宏,我可以选择以下内容并按 CTRL+C 将其放入我的剪贴板:

然后我所要做的就是一行一行地涂抹我的魔法膏。

0 投票
2 回答
5257 浏览

c++ - C++ 中的宏扩展

如何定义参数位于行首的宏(或解决方法)?

这会给出编译器警告(GCC 3.2.3):“'##' 不能出现在宏扩展的任一端”

0 投票
1 回答
2308 浏览

powershell - $macro 替换 - ExpandString 限制

我正在尝试基于此讨论来实现宏替换。基本上它可以工作,但似乎 ExpandString 有一些限制:

主.ps1:

in.config(确定):

in.config(错误:“处理字符串标记时遇到行尾。”):

in.config(错误:“字符串末尾缺少 '。”):

该文档指出:

返回值:已完成所有变量和表达式替换的扩展字符串。

什么是“表达式替换”(可能是我的情况)?

有一些解决方法吗?

0 投票
5 回答
5774 浏览

c++ - C++ 条件宏求值

我有一个全局定义的符号,需要为我的源文件的给定子集有条件地未定义。所有需要特殊处理的文件都已经包含在 pre-inclusions 和 post-inclusions 中:

前.h:

post.h:

我的问题是,由于各种包含链接,给定的源文件可以多次包含pre.hand 。post.h因此,我需要1在第一次包含 pre.h 时发生,我需要2发生在最后一次包含时post.h。从概念上讲:

由于我使用的是 GCC 3.4.6,因此我无法访问可能会为我解决此问题的push 和 pop 宏编译指示。

如何使用剩余的预处理器功能模拟该行为?

我试图用预处理器来增加/减少一个值,但我不确定这是否可能。

“我到底想做什么?”

我们有宏要替换new——new(__FILE__, __LINE__)请参阅我关于这个主题的另一个问题——我们需要取消定义由上述前置和后置包含的源文件集中的这些宏,因为我们无法创建一个宏与其中使用的放置新语法兼容。

0 投票
6 回答
598 浏览

c - 需要帮助将 C 宏重写为函数

我需要一些帮助以更安全的方式重写以下行并将其重写为函数,但是该代码是在函数内部定义的事实使我很难想到一种聪明的方法,因为显然它将涉及声明几个论点。

哪里table是一个structisgood是一个int

0 投票
2 回答
1724 浏览

c - C 风格:宏还是预处理器?

我编写了一个库来将字符串与一组模式进行匹配,现在我可以轻松地将词法扫描器嵌入到 C 程序中。

我知道有许多完善的工具可用于创建词法扫描器(lex 和 re2c,仅列出想到的前两个)这个问题与词法分析器无关,而是关于“扩展”C 语法的最佳方法。词法分析器示例只是一般问题的具体案例。

我可以看到两种可能的解决方案:

  1. 编写一个预处理器,将带有嵌入式词法分析器的源文件转换为纯 C 文件,并可能转换为要在编译中使用的一组其他文件。
  2. 编写一组 C 宏来以更易读的形式表示词法分析器。

我已经做了这两个,但问题是:“根据以下标准,你认为哪一个更好?”

  • 可读性。词法分析器逻辑应该清晰易懂
  • 可维护性。查找和修复错误不应该是一场噩梦!
  • 干扰构建过程。预处理器在构建过程中需要一个额外的步骤,预处理器必须在路径中等等。

换句话说,如果你必须维护或编写一个使用这两种方法之一的软件,哪一种会让你失望更少?

例如,以下是针对以下问题的词法分析器:

  • 对所有数字求和(可以是十进制形式,包括像 1.3E-4.2 这样的指数形式)
  • 跳过字符串(双引号和单引号)
  • 跳过列表(类似于 LISP 列表: (3 4 (0 1)() 3) )
  • 在遇到单词 end(大小写无关)或缓冲区末尾时停止

在两种风格中。


如果有人对当前的实现感兴趣,代码在这里:http ://sites.google.com/site/clibutl 。

0 投票
10 回答
146999 浏览

c# - 预处理器中的 C# 宏定义

C# 是否能够像在 C 编程语言中使用预处理器语句那样定义宏?我想简化某些重复语句的常规输入,例如: