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

c++ - 错误:宏名称必须是使用 #ifdef 0 的标识符

我有一个用 C++ 编写的应用程序的源代码,我只想使用以下方法评论一些东西:

我得到这个错误

错误:宏名称必须是标识符

为什么会这样?

0 投票
6 回答
9155 浏览

metaprogramming - 你可以嵌套 C 预处理器指令吗?

例如,以下是否可能:

0 投票
10 回答
60638 浏览

c++ - 是否有任何宏来确定我的代码是否正在编译到 Windows?

我想检测我正在编译的操作系统是否是 Windows。我可以检查一个简单的宏来验证吗?

0 投票
9 回答
19536 浏览

c - 常量 C 表达式是在编译时还是在运行时计算的?

如果我编写一个使用其他预处理器常量执行操作的#define,每次宏在运行时出现时都会计算最终值吗?这是否取决于编译器中的优化,或者它是否包含在标准中?

例子:

每次我使用 TIMER_100_MS 宏时,运行时会发生32768 / 10操作吗?

我想避免以下情况:


概括

编译器需要能够评估常量整数表达式,因为它们对于在编译时计算诸如数组大小之类的东西是必需的。然而,标准只说他们“可以”——而不是“必须”——这样做。因此,只有脑死亡的编译器不会在编译时评估常量整数表达式,但对非常规编译器的汇编输出进行简单检查将验证每种情况。

0 投票
5 回答
8902 浏览

c - 使 C 预处理器忽略某些 #include 指令

我在这里使用了一个解析器生成器,不幸的是它坚持要放置一个

在每个生成的源文件的顶部。标题早已被重命名。虽然强制编译器(gcc)使用新的头文件没有问题-include new/header.h,但从每个生成的文件中删除上述指令会使构建过程复杂化。

有没有办法告诉 gcc 简单地忽略some/file.h

0 投票
7 回答
13901 浏览

c++ - 什么时候可以在#include 指令中省略文件扩展名?

我正在玩 gmock 并注意到它包含这一行:

我会预料到tuple.h的。

什么时候可以排除扩展名,它是否赋予指令不同的含义?

0 投票
1 回答
2392 浏览

gcc - 如何强制 gcc 预处理器保留空格?

对于代码:

gcc 预处理器输出:

如何强制它保留空白?

我用: gcc -E somefile.c 命令调用预处理器。

0 投票
4 回答
1161 浏览

c++ - 使用预编译器的字符串连接

我有以下问题。我想包含一个多行文本文件#define,即我需要的是一个存储文本文件值的常量。例子:

我想以如下方式初始化一个常量(在编译时)

其中字符串“This\nis\na\ntextfile”是通过连接文件 f.txt 中的行获得的。有没有办法使用预处理器命令/宏来实现这一点?

0 投票
1 回答
3688 浏览

c++ - C++ anonymous variables

Why won't this work?

The result from the above macro expansion

It would be convenient if I didn't have to write that __LINE__ macro as an argument.

I'm thinking the problem is pretty clear. I want to be able to generate anonymous variables so that this macro doesn't fail with redefinition error when declaring several variables within the same scope. My idea was to use the predefined __LINE__ macro because no variable will ever be declared on the same line like this. But the macro expansion troubles me, can you help?

Update: Correct answer

Thanks to Luc Touraille. However, there was a tiny problem with the suggested solution. There has to be whitespace between the operands and the ## operator (apparently the standard says otherwise but the the PS3 flavoured GCC would not expand the macro properly if there were no whitespace between the operator and operands).

The VAR_LINE macro now yields:

This has been verified to work under Win32 (Visual Studio 2008), XBOX360 (Xenon) and PS3.

0 投票
14 回答
5514 浏览

c# - 需要引用:使用预处理器是不好的 OO 实践

我相信,像这样的预处理器指令的使用#if UsingNetwork是不好的 OO 实践——其他同事不这样做。我认为,当使用 IoC 容器(例如 Spring)时,如果相应地编程,组件可以很容易地配置。在这种情况下,IsUsingNetwork可以由 IoC 容器设置属性,或者,如果“使用网络”实现的行为不同,则应该实现并注入该接口的另一个实现(例如:IService、、、ServiceImplementationNetworkingServiceImplementation

有人可以提供OO-Gurus 的引用或书籍中的参考资料,这些书籍基本上是“如果您尝试配置应该通过 IoC 容器配置的行为,预处理器的使用是不好的 OO 实践”?

我需要这些引用来说服同事重构......

编辑:我确实知道并同意在编译期间使用预处理器指令来更改目标平台特定的代码很好,这就是预处理器指令的用途。但是,我认为应该使用运行时配置而不是编译时配置来获得良好的设计和可测试的类和组件。换句话说:使用#defines 和#if 超出它们的用途将导致难以测试代码和设计糟糕的类。

有没有人读过这些方面的东西,可以给我,以便我参考?