为什么人们使用 #ifdef 进行功能标志测试?

2024-01-11

People 推荐#ifdef条件编译大幅提高 https://stackoverflow.com/q/21256252/103167. A 搜索#ifdef https://stackoverflow.com/search?q=%23ifdef证实其使用是普遍的。

Yet #ifdef NAME(或同等地#if defined(NAME)以及相关的#ifndef NAME (and #if !defined(NAME))有一个严重的缺陷:

header.h

#ifndef IS_SPECIAL
#error You're not special enough
#endif

源代码.cpp

#include "header.h"

gcc -DIS_SPECIAL 源.cpp

显然,将会过去

源1.cpp

#define IS_SPECIAL 1
#include "header.h"

但是,也会如此

源0.cpp

#define IS_SPECIAL 0
#include "header.h"

这是完全错误的做法。一些 C++ 编译器传递了一个处理过的文件C模式(由于扩展或命令行选项)有效地执行#define __cplusplus 0。我见过事情破裂的时候

#ifdef __cplusplus
extern "C" {
#endif
/* ... */
#ifdef __cplusplus
}
#endif

被处理于C模式,其中extern "C"是无效语法,因为__cplusplus实际上被自动定义为0.

另一方面,这对于所有编译器来说都是正确的:

#if __cplusplus
extern "C" {
#endif
/* ... */
#if __cplusplus
}
#endif

为什么人们仍然使用#ifdef在这种情况下?难道他们根本不知道#if在未定义的名称上工作得很好吗?或者有实际的缺点吗#if vs #ifdef用于条件编译?


明显地,#ifdef确实有有效的用途,例如为可配置参数提供默认值:

#ifndef MAX_FILES
#define MAX_FILES 64
#endif

我只讨论标志测试的情况。


为什么人们在这种情况下仍然使用#ifdef?

个人意见:从命令行控制稍微容易一些。我更喜欢-DOPTION over -DOPTION=1.

而且,名称的存在显然是二元的。我不必能够处理{0,非零,未定义}。

他们是否只是不知道#if 对于未定义的名称可以完美地工作?

我不知道。这有什么语义?未定义的名称是否假定为 0?我是否需要向一个几乎不了解预处理器的人解释这一点?

或者 #if 与 #ifdef 对于条件编译有实际的缺点吗?

对我来说,二元本质#ifdef/#ifndef名称存在的好处是清晰。 另外,我对任一构造的主要用途是用于包含防护。那个图案是最干净的#ifndef.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么人们使用 #ifdef 进行功能标志测试? 的相关文章

随机推荐

  • 简单配置时收到 Wix 安装程序错误代码 2343。 (WIX新手)

    使用以下简单的 WIX 配置时 我收到以下错误 正在安装的应用程序是 WPF 产品 Web Miner 安装程序 安装程序在安装此软件包时遇到意外错误 这可能表明此包有问题 错误代码为 2343 参数为
  • Spark应用程序状态中的FAILED和ERROR有什么区别

    我正在尝试创建已提交的 Spark 应用程序的状态图 当应用程序被视为失败时 我有点迷失了 各州来自这里 https github com apache spark blob d6dc12ef0146ae409834c78737c11605
  • 如何在sql中进行join时保持顺序

    表1和表2的主键 key1 key2 相同 表 3 是用户定义的表 具有与表 2 相同的一列字段 5 我需要从表 1 和表 2 中选择行 其中表 2 中的 field5 位于表 3 中 我需要以与 table3 相同的顺序获取行 table
  • 停留在显示 PHP 分页器上

    我正在尝试创建一个分页器 我创建了一个分页器类 其属性如下所示 但现在我正在尝试显示分页器 但我完全陷入了不同的循环 也许我应该去睡觉 P 之类的东西 重要的属性是 windows size the amount of pages visi
  • 如何使用 CSS 类选择第一个、第二个或第三个 html 元素内的子元素?

    我想在 CSS 中选择锚标记 出于以下 html 文档的目的 我也做了同样的事情 我的 html 文档在这里 div class first div
  • 用于扫描仪颜色意图的 WIA 自动化不起作用

    我无法让我的 Canon Pixma MP150 从 C 代码进行彩色扫描 以下代码会生成黑白图像 或者如果我将 6146 的值更改为 2 则会创建灰度图像 我希望能够通过代码进行彩色扫描 我知道扫描仪可以处理彩色图像 因为我可以通过 扫描
  • 当我在 PHP 中使用 cURL 发布文件时,是否应该设置 CURLOPT_UPLOAD?

    当我尝试设置它时 它会强制请求方法被 PUT 这是我在 CURLOPT POSTFIELDS 中放入的内容 curl setopt ch CURLOPT POSTFIELDS array fileUpload gt home apache
  • Visual Studio:如何将 obj 文件夹保存在其他位置

    有谁知道如何告诉 VS 2008 在构建解决方案时保存 obj 文件夹的位置 我们让它将 bin 文件夹保存到另一个路径 以保持源文件文件夹较小 即可通过电子邮件发送 但找不到任何方法告诉它对 obj 执行相同的操作 Use the Bas
  • 编辑选定列表视图项目的项目或子项目值

    好的 所以我在一个表单上有一个列表视图 当按下按钮时 它会打开一个新表单 其中包含所选列表视图项目的内容及其一系列文本框中的子项目 然后 用户可以更改文本框中的数据 然后按 保存 进行更改或按 取消 关闭窗口 我将使用什么命令将选定的列表视
  • 发送短信导致一般失败

    我使用一种非常常见的方式通过我的应用程序发送短信 几乎所有教程中都对此进行了解释 我将 sendMultipartTextMessage 与 发送意图 和 传递意图 一起使用 然后广播接收器侦听结果并打印内容 但是 每次我尝试发送短信时 即
  • 为什么需要 lambda 来嵌套 defaultdict?

    我有点困惑为什么你需要一个 lambda 函数来嵌套 defaultdict 为什么你不能这样做呢 test defaultdict defaultdict list 代替 test defaultdict lambda defaultdi
  • “完全二叉树”、“严格二叉树”、“满二叉树”之间的区别?

    我对以下树的术语感到困惑 我一直在研究树 但无法区分这些树 a 完全二叉树 b 严格二叉树 c 完整二叉树 请帮我区分这些树 这些树何时何地在数据结构中使用 完美的树 x x x x x x x x x x x x x x x 完整的树 x
  • 如何使文本在节点中居中?

    我正在学习关于d3 js和力量体系 我有一个拦截器 因为我无法添加文本 并且它完全位于圆圈的中心 我曾尝试创建
  • 纯 WebGL 虚线

    我正在尝试使用纯 webgl 创建一条虚线 我知道已经有一个问题了 也许我很蠢 但我不知道如何让它发挥作用 我理解这个概念 但我不知道如何获取着色器中沿路径的距离 之前的答案有以下一行 varying float LengthSoFar l
  • 为什么结构体和可变结构体具有不同的默认相等运算符?

    我有以下代码 julia gt struct Point x y end julia gt Point 1 2 Point 1 2 true julia gt mutable struct Points x y end julia gt P
  • 如何获取谷歌地图标记上的双击事件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在我的应用程序中 我显示具有多个标记的谷歌地图 因为我有点击事件和获取信息窗口 但是我需要的是 当我双击标记时 应该显示包含有关该标记
  • 尝试连接到 .onion 站点时 Python 请求失败

    我正在尝试获取托管在 tor 网络中的网页 我正在使用以下代码 import requests def get tor session session requests session session proxies http socks5
  • CSS,自动调整div大小?

    我正在尝试用 css 设计一种布局 我有一个主容器 div 和两个内部容器 div upper 和 div lower 假设我想调整 div upper 和 div lower 的大小 它们会自动调整自身大小 并且两个 div 仍然适合主容
  • Azure Linux 应用服务:从 DevOps 管道部署后安装包

    我目前正在 Azure Devops 中设置 CI CD 管道 以在 Linux 托管应用程序服务 而不是 VM 上部署 NodeJS 应用程序 我的构建和部署都很顺利 但我需要确保在部署应用程序后在环境中安装一些软件包 问题是 无论如何a
  • 为什么人们使用 #ifdef 进行功能标志测试?

    People 推荐 ifdef条件编译大幅提高 https stackoverflow com q 21256252 103167 A 搜索 ifdef https stackoverflow com search q 23ifdef证实其