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

c - 如何从 C 宏的值生成 char 字符串?

例如,如何避免两次写入'func_name'?

我想遵循单点真理规则。

C预处理器版本:

0 投票
4 回答
411 浏览

c - _never_executed() 的目的是什么?

我以前见过这个宏定义,但从来没有真正知道它的用途。任何人都可以阐明这一点吗?

0 投票
8 回答
14028 浏览

c - #undef-ing 在实践中?

我想知道#undef 在 C 中的实际用途。我正在研究 K&R,并且正在处理预处理器。其中大部分是我(或多或少)理解的材料,但第 90 页(第二版)的内容让我印象深刻:

名称可以用 未定义#undef,通常是为了确保例程确实是函数,而不是宏:

#undef getchar

int getchar(void) { ... }

这是防止某人#define使用与您的函数同名的宏的常见做法吗?或者这真的更像是一个在现实中不会发生的样本?(EG,没有人在他的正确,错误或疯狂的头脑中应该重写getchar(),所以不应该出现。)有了你自己的函数名,你觉得有必要这样做吗?如果您正在开发一个供其他人使用的库,这种情况会改变吗?

0 投票
13 回答
71468 浏览

c - ## 预处理器运算符的应用和要考虑的问题是什么?

正如我之前的许多问题中提到的,我正在通过 K&R 工作,目前正在进入预处理器。更有趣的事情之一——我以前尝试学习 C 时从未知道的事情——是##预处理器操作符。根据 K&R:

预处理器运算符## 提供了一种在宏扩展期间连接实际参数的方法。如果替换文本中的参数与 a 相邻##,则将参数替换为实际参数, ##并删除周围的空白,并重新扫描结果。例如,宏paste 连接它的两个参数:

#define paste(front, back) front ## back

所以paste(name, 1)创建了令牌 name1

有人如何以及为什么会在现实世界中使用它?有哪些实际使用示例,是否有需要考虑的问题?

0 投票
3 回答
3050 浏览

c - Fortran 数组到 C 数组。需要愚蠢的宏观技巧

我有这个“简化”的 fortran 代码

一位编程大师警告我,fortran 按列顺序有效访问数据,而 c 按行顺序有效访问数据。他建议我仔细查看代码,并准备好切换循环以保持旧程序的速度。

作为一个懒惰的程序员,我认识到所涉及的时间以及我可能犯的错误,我开始想知道是否有一种#define 技术可以让我安全、轻松地转换这段代码。

你有什么建议吗?

0 投票
11 回答
188449 浏览

c - 在另一个中包含一个 C 源文件?

另一个文件中#include的文件可以(甚至推荐/良好做法)吗?.c.c

0 投票
6 回答
86620 浏览

c - 将预处理器标记转换为字符串

我正在寻找一种将预处理器令牌转换为字符串的方法。

具体来说,我在某个地方得到了:

我想用它来防止缓冲区溢出:

我愿意接受其他方式来完成同样的事情,但仅限于标准库。

0 投票
10 回答
1519 浏览

c++ - 构建相同 C/C++ 应用程序变体的最佳方法是什么

我有三个密切相关的应用程序,它们是从相同的源代码构建的——比如说 APP_A、APP_B 和 APP_C。APP_C 是 APP_B 的超集,而 APP_B 又是 APP_A 的超集。

到目前为止,我一直在使用预处理器定义来指定正在构建的应用程序,它的工作原理是这样的。

然后我的 IDE 构建选项指定(例如)

...在源代码中,我会有类似的东西

但是,今天早上我开枪打死了自己,只是从一个文件中省略了 #include "app_defines.h" 行,这浪费了很多时间。一切编译正常,但应用程序在启动时与 AV 一起崩溃。

我想知道处理这个问题的更好方法是什么。以前,这通常是我认为可以使用#define 的少数几次之一(无论如何,在 C++ 中),但我仍然搞砸了,编译器没有保护我。

0 投票
3 回答
6600 浏览

c - 什么是记录在 C(或可能是 C++)中使用 X-Macros 模式的良好参考?

在 C 预处理器的这个维基百科条目中给出了“ X-Macros ”的基本定义和示例以及一些参考:

X-Macro 是一个头文件(通常使用“.def”扩展名而不是传统的“.h”),其中包含类似宏调用的列表(可以称为“组件宏”)。

关于如何使用这种强大的技术,有哪些好的信息来源?有使用这种方法的知名开源库吗?

0 投票
9 回答
44889 浏览

c++ - 包含#include 指令的宏定义

有没有办法定义一个#include 在其主体中包含指令的宏?

如果我只是把“ #include”,它给出了错误

因为在这里我不用#来连接字符串。
如果我使用“ \# include”,则会收到以下两个错误:

有什么帮助吗?