C++ 宏有条件编译代码?

2023-11-29

我想根据宏有条件地编译代码。基本上我有一个看起来像这样的宏(从真实版本简化):

#if DEBUG
    #define START_BLOCK( x ) if(DebugVar(#x) \
        { char debugBuf[8192];
    #define END_BLOCK( ) printf("%s\n", debugBuf); }
#else
    #define START_BLOCK( x ) (void)0;
    #define END_BLOCK( ) (void)0;
#endif

问题是如果DEBUG被定义你可以做这样的事情:

START_BLOCK( test )
     char str[] = "Test is defined";
     strcpy(debugBuf, str);
END_BLOCK( )

START_BLOCK( foo )
    char str[] = "Foo is defined";
    strcpy(debugBuf, str);
END_BLOCK( )

一切都工作正常,因为每个块都在它自己的范围内。但是,如果未定义 DEBUG,那么您将得到重新定义str在第二个块中。 (那么你也会得到debugBuf未定义,但这只是简化示例的副作用。)

我想做的是让 #else 类似于:

#else
    #define START_BLOCK( x ) #if 0
    #define END_BLOCK( ) #endif
#endif

或者其他一些不编译开始/结束块之间的任何内容的方法。我尝试了上面的方法,我还尝试了以下内容:

#else
    #define NULLMACRO( ... ) (void)0
    #define START_BLOCK( x ) NULLMACRO(
    #define END_BLOCK( ) )
#endif

没有任何运气。

有办法让它发挥作用吗?我刚刚想到的一个想法是我可能会滥用优化编译器并使用:

#else
    #define START_BLOCK( x ) if(0){
    #define END_BLOCK( ) }
#endif

并相信它会完全编译出该块。还有其他解决方案吗?


那么您想要具有自己范围的条件块吗?

这是一个非常可读的解决方案,依赖编译器对其进行优化:

#define DEBUG 1

if (DEBUG) {
    // ...
}

这是仅预处理器的一个:

#define DEBUG 1

#ifdef DEBUG
    #define IFDEBUG(x) {x}
#else
    #define IFDEBUG(x)
#endif

IFDEBUG(
    // ...
)

或者手动:

#define DEBUG 1

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

C++ 宏有条件编译代码? 的相关文章

  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • std::bind 重载解析

    下面的代码工作正常 include
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu

随机推荐

  • 用于初始化列表列表的简洁语法

    C 中是否有用于初始化列表列表的简洁语法 I tried new List
  • 使用 setAttribute 方法() 的 Aurelia 自定义属性

    当我在 javascript 中创建和附加元素并设置自定义属性时 Aurelia 似乎并不知道 除非我做错了什么 例如 const e document createElement div e setAttribute custom att
  • 如何将 iScroll4 与 SwipeView 结合使用?

    我正在使用 iScroll4 在移动网站内的图像上创建水平滚动效果 iScroll 工作得非常好 但问题是 iScroll 包装器中包含的图像禁用了本机垂直滚动 换句话说 用户通过手指滑动来导航页面的操作在 iScroll 包裹图像内的任何
  • 在php中获取图像src

    如何使用 php 函数从 img 标签获取图像源 或者 您可以使用内置 DOM 函数 如果您使用 PHP 5 doc new DOMDocument doc gt loadHTMLFile url xpath new DOMXpath do
  • 录制成WAV文件

    自从我发帖以来这个问题 我一直在尝试自己从原始 PCM 数据编写一个有效的 WAV 文件 我已经成功编写了 FLAC 转换器 经过测试并且可以工作 但它不会对我一直在编写的 WAV 文件进行编码 我不确定我做错了什么 我一直在网上搜索其他个
  • 确定 .NET Core 中的操作系统

    如何确定我的 NET Core 应用程序正在哪个操作系统上运行 过去我可以使用Environment OSVersion 当前确定我的应用程序是在 Mac 还是 Windows 上运行的方法是什么 Method System Runtime
  • List 作为使用 Spring 3 MVC 的表单支持对象,语法正确吗?

    我想做这样的事情 在哪里Foo是一个具有一个 String 字段名称和 getter setter 的类
  • 音频队列启动失败

    我正在开发一个项目 它既有音频流又有文件播放音频 对于音频流 我使用 AudioStreamer 对于从文件播放 我使用 avaudioplayer 只要应用程序不被电话或短信打断 流媒体和播放都可以完美运行 但是 当我尝试重新启动流媒体时
  • 如何删除 XCode 4.2 并安装 4.1 以在 OSX Lion 上开发 Ruby / Rails?

    我使用 RVM ruby 版本管理器 开发 Rails 应用程序 我必须下载 XCode 在应用商店中我只得到了 4 2 版本 现在 RVM 说它无法使用此 XCode 正确构建 rubies 所以我遵循了本教程 http www fred
  • Reactjs - 当谷歌仅显示空白页面时获取

    I ve just coded my first website using reactjs but when I check how google sees my website I receive the following resul
  • PHP 将两个独立的冲突日期范围组合成唯一的对

    设置一 2014 04 05 至 2014 06 27 2014 06 28 至 2014 10 19 Set two 2014 04 05 至 2014 05 02 2014 05 03 至 2014 05 31 2014 06 01 至
  • VBA Access 获取 RowSource 来查找查找值

    VBA菜鸟在这里 截至此哀悼 在 MS Access 中 我编写了一个测试函数 根据您传入的某些条件查找记录的值 该函数似乎工作正常 除非我正在搜索的列中有查找 基本上它可能返回 19 并且 19 对应于其他一些表值 看来该列的 RowSo
  • C# 将一个图片框拖放到另一个图片框

    我正在尝试将一个图片框拖放到另一个图片框中 请帮我 谢谢 此致 看到这个http www codeguru com Csharp Csharp cs syntax controls article php c5865 更新 做一招 bool
  • 调试 ADO log4net 附加程序(不会附加)

    我以前曾这样做过 但现在不起作用 在过去的两个小时里我一直在抓狂地试图弄清楚它 我有几个附加程序 其中一些用于 主 日志 另一个用于另一个 任务 日志 主日志有 4 个附加程序 控制台 内存 文件和 DB sqlite3 任务日志有 3 个
  • CallKit 有两个来电

    我使用 CallKit 开发 VoIP 应用程序 如果用户收到两个来电并且他 她接听其中一个来电 则另一个将被关闭 例如报告两个来电 reportInComingCall uuid 70D506FB 6A9D 4111 8828 35DB8
  • 获取列表类型的元素类型[重复]

    这个问题在这里已经有答案了 我有一些列表类型 来自inspect signature gt inspect Parameter 并且我想了解它们元素的类型 我当前的解决方案有效 但非常丑陋 请参阅下面的最小示例 from typing im
  • 有没有办法访问replicate()中的迭代次数?

    有没有办法访问当前的复制数replicate函数 这样我就可以将它用作重复评估中的变量 例如 在这个简单的示例中 我想使用当前复制数来生成当前复制数的可变长度向量列表 例如 x下面代表当前的复制 replicate 3 rep x samp
  • 如何获取程序运行的目录?

    是否有一种与平台无关和文件系统无关的方法来获取使用 C C 运行程序的目录的完整路径 不要与当前工作目录混淆 请不要推荐库 除非它们是标准库 例如 clib 或 STL 如果没有与平台 文件系统无关的方法 也欢迎在 Windows 和 Li
  • R.layout.menu无法解析

    早些时候一切都工作正常 然后我碰巧向我的布局添加了一个新的 xml 文件 现在 当 setContentView 指向 R layout menu 时 我的一个类出现错误 Eclipse 告诉我 R layout menu 无法解析 我不明
  • C++ 宏有条件编译代码?

    我想根据宏有条件地编译代码 基本上我有一个看起来像这样的宏 从真实版本简化 if DEBUG define START BLOCK x if DebugVar x char debugBuf 8192 define END BLOCK pr