问题标签 [c-preprocessor]

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 投票
3 回答
65912 浏览

c++ - C++中定义的WIN32和_WIN32有什么区别

我知道这WIN32表示 win32 编译,但它是_WIN32用来做什么的?

0 投票
6 回答
213810 浏览

c - 如何制作可变参数宏(可变数量的参数)

我想用 C 编写一个宏,它接受任意数量的参数,而不是特定的数字

例子:

其中X是任意数量的参数

我需要这个,因为whatever它重载并且可以用 2 或 4 个参数调用。

我尝试定义宏两次,但第二个定义覆盖了第一个!

我正在使用的编译器是 g++(更具体地说,mingw)

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 投票
2 回答
5644 浏览

c# - 为整个项目全局声明预处理器符号(如 DEBUG)

我想像这样在 NUnit 和 VS 测试之间切换:

我的问题是,我如何在一个地方声明 NUNIT 预处理器符号(App.config 左右,会很棒),以便在 NUnit 和 VSTests 之间轻松切换?因为当我使用时#define NUNIT,它仅适用于写入它的文件。

0 投票
10 回答
146999 浏览

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

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

0 投票
5 回答
4007 浏览

c++ - C2065 将定义分配给 int 时未声明的标识符

我有一个定义的小问题。我想将它分配给一个整数变量,但编译器说它未声明。

下面是代码的样子:defines.h

我的班级.h

我的班级.cxx

根据 int 赋值,会发​​生编译器错误。我还尝试使用另一个定义,定义在与上面相同的头文件中,作为具有相同效果的函数参数。有任何想法吗?提前致谢。

我知道使用定义是一个坏习惯,但我只扩展现有项目并尝试保持他们的设计方式。

编辑:错误消息很简单:Fehler 1 error C2065: 'MYDEFINE': nichtdeklarierter Bezeichner ...正如您所见,这不是真正的源代码,但我认为我在整理问题时非常小心。

EDIT2:感谢#warning 的提示。在不同的文件夹中有 2 个同名文件。我不知道为什么编译器没有提出这个。无论如何,它现在有效。

0 投票
6 回答
2801 浏览

c - 是否删除#ifdef DEBUG 部分以进行发布?

当发布源代码供其他人查看时,当编码风格没有明确定义(没有双关语)时,您是否删除了#ifdefDEBUG 部分?

(即只有在定义了 DEBUG 时才编译的部分)

如果我删除它,它会使代码看起来更好(或者我看起来更好 - 我真的希望有人知道我已经调试过,以及我是如何做到的吗?),但是我会丢失我的调试部分,或者必须保留两个(或更多)版本的代码。

什么是要做?