问题标签 [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 投票
6 回答
2469 浏览

c - 在代码中修改 __FILE__ 和 __LINE__ 以进行引用?

有没有办法让 C/C++ 预处理器或模板等对 __FILE__ 和 __LINE__ 以及其他一些外部输入(如内部版本号)进行处理/散列到可以在日志或错误消息中引用的单个短数字中?

(目的是当客户在错误报告中引用它时,能够在需要时将其反转(如果它有损,则为候选列表)。)

0 投票
16 回答
176050 浏览

c - 如何使用预处理器指令检查操作系统?

我需要我的代码根据编译它的操作系统来做不同的事情。我正在寻找这样的东西:

有没有办法做到这一点?有没有更好的方法来做同样的事情?

0 投票
9 回答
49048 浏览

c++ - 可以使用 C 预处理器来判断文件是否存在吗?

我有一个非常大的代码库(阅读:数千个模块),其中代码在众多项目中共享,这些项目都运行在具有不同 C++ 编译器的不同操作系统上。不用说,维护构建过程可能是一件苦差事。

#includes如果只有在当前文件夹中不存在文件的情况下,如果有办法让预处理器忽略某些情况,代码库中有几个地方会大量清理代码。有谁知道实现这一目标的方法?

目前,我们在共享文件中使用了一个#ifdef环绕的#include,第二个特定于项目的文件 #defines 是否#include存在于项目中。这有效,但它很丑。人们在从项目中添加或删除文件时经常忘记正确更新定义。我已经考虑编写一个预构建工具来保持这个文件是最新的,但是如果有一种独立于平台的方式来使用预处理器来做到这一点,我宁愿这样做。有任何想法吗?

0 投票
20 回答
113333 浏览

c - 在C中使用枚举类型的变量作为字符串的简单方法?

这是我想做的事情:

我正在尝试编写一个函数来执行类似于以下的切换案例:

有没有办法像我在上面尝试做的那样使用枚举变量来设置它,而不是在每种情况下都定义?

0 投票
10 回答
18056 浏览

php - 在 PHP 中定义的效率如何?

C++ 预处理器#define完全不同。

PHPdefine()与仅仅创建一个var有什么不同吗?

对比

0 投票
9 回答
104281 浏览

c++ - 为什么在宏中使用看似毫无意义的 do-while 和 if-else 语句?

在许多 C/C++ 宏中,我看到宏的代码被包裹在一个看似毫无意义的do while循环中。以下是示例。

我看不到do while它在做什么。为什么不直接写这个呢?

0 投票
8 回答
20526 浏览

c++ - 如何检测我是否正在为 C++ 中的 64 位架构进行编译

在 C++ 函数中,如果它正在为 64 位架构编译,我需要编译器选择不同的块。

我知道为 MSVC++ 和 g++ 做的一种方法,所以我会把它作为答案发布。但是我想知道是否有更好的方法(更优雅,适用于所有编译器/所有 64 位架构)。如果没有更好的方法,我应该寻找哪些其他预定义宏才能与其他编译器/架构兼容?

0 投票
9 回答
134662 浏览

c++ - 如何使 C++ 宏表现得像函数?

假设由于某种原因您需要编写一个宏:MACRO(X,Y)(让我们假设您不能使用内联函数是有充分理由的。) 您希望此宏模拟对没有返回值的函数的调用。


示例 1:这应该按预期工作。

示例 2:这不应导致编译器错误。

示例 3:这不应该编译


编写宏的幼稚方法是这样的:

这是一个非常糟糕的解决方案,所有三个示例都失败了,我不需要解释原因。

忽略宏的实际作用,这不是重点。


现在,我最常看到宏的编写方式是将它们括在花括号中,如下所示:

这解决了示例 1,因为宏位于一个语句块中。但是示例 2 被破坏了,因为我们在调用宏之后放置了一个分号。这使得编译器认为分号本身就是一个语句,这意味着 else 语句不对应任何 if 语句!最后,示例 3 编译成功,即使没有分号,因为代码块不需要分号。


有没有办法编写一个宏以使其通过所有三个示例?


注意:我提交我自己的答案作为共享提示的公认方式的一部分,但如果有人有更好的解决方案,请随时在此处发布,它可能会比我的方法获得更多的选票。:)

0 投票
6 回答
44426 浏览

c++ - #warning 预处理器指令的可移植性

我知道 #warning 指令不是标准的C /C++,但有几个编译器支持它,包括 gcc/g++。但是对于那些不支持它的人,他们会默默地忽略它还是会导致编译失败?换句话说,我可以在我的项目中安全地使用它而不破坏不支持它的编译器的构建吗?

0 投票
10 回答
24555 浏览

c++ - C++ #include 语义

这是同一预处理指令的多个问题。

1 - <> 或 "" ?

除了在 MSDN 中找到的信息:

#include 指令 (C-C++)

1.a:这两种符号有什么区别?
1.b:所有编译器都以相同的方式实现它们吗?
1.c:您什么时候使用<>,什么时候使用“”(即,您使用其中一个或另一个作为标题包含的标准是什么)?

2 - #include {TheProject/TheHeader.hpp} 或 {TheHeader.hpp} ?

我已经看到至少有两种写作方式包括一个项目的标题。考虑到您至少有 4 种类型的标头,即:

  • 您项目的私有标头?
  • 项目的标头,但正在导出符号(因此,“公共”)
  • 您的模块链接的另一个项目的标题
  • 编译器或标准库的头文件

对于每种标题:

2.a:你会使用 <> 还是 "" ?
2.b:您会包含在 {TheProject/TheHeader.hpp} 中,还是仅包含在 {TheHeader.hpp} 中?

3 - 奖金

3.a:您是否在树状组织中使用源代码和/或标头进行项目(即目录中的目录,而不是“一个目录中的每个文件”),优点/缺点是什么?