草庐IT

c++ - 如何在#ifdef 中执行宏扩展?

我有一些相当通用的代码,它们使用预处理器宏将某个前缀添加到其他宏上。这是发生的事情的一个非常简化的例子:#defineMY_VAR(x)prefix_##x“prefix_”实际上是在别处定义的,所以每次包含文件时都会不同。它运行良好,但现在我有一些代码,如果其中一个标记不存在,我想跳过,但这不起作用:#ifdefinedMY_VAR(hello)我希望它扩展到的是:#ifdefprefix_hello但是我不知道怎么办。我需要使用MY_VAR()宏来进行扩展,所以我不能只对名称进行硬编码。(它实际上是针对一些测试代码,相同的代码每次都包含不同的前缀来测试一堆类,我想跳过一些类的几个测

c++ - D 中的语句宏

我正在将我用C++编写的一些代码移植到D。有一次我引入了一个方便的宏,其中包含一个赋值。喜欢#defineso_convenient(x)value=some_func(x,#x)所以我用宏来访问实际符号及其字符串布置作业。我如何在D中实现这一目标? 最佳答案 您可以使用mixin语句在编译时将字符串转换为代码,例如:mixin("value=123;");以下函数将生成一个字符串,其中包含最接近C宏的语句:stringsoConvenient(aliasA)(){returnstd.string.format('value=som

c++ - #warning 和 #error 作为宏

有没有办法让宏在编译时强制发出警告和错误?我目前有这样的东西:#ifdefined(__clang__)#definePRAGMA(x)_Pragma(#x)#elifdefined(__GNUC__)#definePRAGMA(x)_Pragma(#x)#elifdefined(_MSC_VER)#definePRAGMA(x)__pragma(x)#endif#defineSTRINGISIZE(str)#str#defineSTR(str)STRINGISIZE(str)#defineLINESTR(__LINE__)#defineFILE__FILE__#defineFILE_

c++ - 使用指向在结构内声明的字段的指针(又名 CONTAINING_RECORD 宏)计算指向整个结构的指针的可移植方法

例如,在Winnt.h中定义了众所周知的CONTAINING_RECORD()宏:#defineCONTAINING_RECORD(address,type,field)((type*)(\(PCHAR)(address)-\(ULONG_PTR)(&((type*)0)->field)))或在FreeBSD中:#defineCONTAINING_RECORD(addr,type,field)\((type*)((vm_offset_t)(addr)-(vm_offset_t)(&((type*)0)->field)))或在Linux中:#defineoffsetof(TYPE,MEM

c++ - strings.h 并用宏检查包装这个宏是否

我从Google搜索结果中推断出strings.h(来自here)适用于UNIX系统。我想用主机操作系统是否为Linux/UNIX的宏观检查来包装以下行。听到有关它的建议将不胜感激。提前致谢。#include 最佳答案 strings.h只包含几个函数,其中大部分只是标准库中函数的不同名称(例如bcmp()memcmp())。如果您的代码使用这些函数,而不是到处乱扔#ifdef为什么不编写您自己的集合呢?然后每个人都可以使用它们并愉快地免费进行条件编译。这是公共(public)领域中的一组未完全测试的函数,您可以自行承担使用风险:#

c++ - 不需要的 C 预处理器宏扩展

我正在使用依赖于REQUIRE宏来执行断言的单元测试框架。简化后,宏的工作原理如下:#defineREQUIRE(expr)INTERNAL_REQUIRE(expr,"REQUIRE")其定义与此类似:#defineINTERNAL_REQUIRE(expr,macroName)\PerformAssertion(macroName,#expr,expr);PerformAssertion的前两个参数属于以下类型:constchar*。使用第二个参数(#expr)的原因是可以记录断言的确切表达式。这就是问题所在。预处理器在将表达式作为constchar*传递之前对其进行扩展,因此它与

c++ - 预处理器计数器宏

有没有办法创建一个COUNTER()宏(遵循C++11/14标准)扩展为一个数字,每次COUNTER()被调用了吗?我已经考虑过了,但找不到让它发挥作用的方法。我没有找到在COUNTER()宏中存储“状态”的方法。示例:#defineCOUNTER()//Implementationgoeshere...#defineUNIQUE_NAME_1()TEST##COUNTER()#defineUNIQUE_NAME_2()TEST##COUNTER()//NotehowtheCOUNTER()macrocanbeusedwithothermacros//(itcannotbeimplem

c++ - 在不使用宏的情况下减少语法 "noise"

我正在尝试寻找一种无需借助宏即可减少语法“噪音”的方法。对于以下代码:structbase{base()=delete;};structtag1final:privatebase{staticconstexprconstchar*name="tag1";};templatestd::stringname(){returnT::name;}//...intmain(){conststd::stringname1(name());return0;}最好摆脱一些staticconstexprconstchar*(更不用说其他)语法,因为为tag2重复该语法会很烦人>、tag3等。另外,所有真

c++ - 这个宏语句是合法的 C++ 还是其他什么?如果它是合法的,它是如何工作的

WebKit有很多这样的预处理器行:#ifMACRO1(MACRO2)例如:#ifPLATFORM(MAC)||(PLATFORM(QT)&&USE(QTKIT))#include"MediaPlayerPrivateQTKit.h"#ifUSE(AVFOUNDATION)#include"MediaPlayerPrivateAVFoundationObjC.h"#endif...所以我的第一个想法是它们是类似函数的宏,但我看不出它是如何工作的,而且我在源代码中的任何地方都找不到这些宏的任何#defines。我问过另一位工程师这是什么,他之前也从未见过在#if中像这样使用多个宏。我找到

c++ - 用于调试日志语句的预处理器宏是否在 C++ 中占有一席之地?

最近我一直在阅读ScottMeyers的EffectiveC++SecondEdition,以改进C++最佳实践。他列出的项目之一鼓励C++程序员避免预处理器宏并“更喜欢编译器”。他甚至说除了#include和#ifdef/#ifndef之外,C++中几乎没有使用宏的理由。我同意他的推理,因为你可以完成下面的宏#definemin(a,b)((a)具有以下C++语言特性templateinlineconstT&min(constT&a,constT&b){returna其中inline为编译器提供了删除函数调用和插入内联代码和模板的选项,这些代码和模板可以处理具有重载或内置>运算符的多