草庐IT

c++ - 用于 C 和 C++ 的函数签名的可移植 UNUSED 参数宏

我有兴趣创建一个宏来消除未使用的变量警告。这个问题描述了一种通过在函数代码中编写宏来抑制未使用参数警告的方法:UniversallycompilerindependentwayofimplementinganUNUSEDmacroinC/C++但我对可以在函数签名中使用的宏感兴趣:void回调(intUNUSED(some_useless_stuff)){}这是我用谷歌挖出来的(source)#ifdefUNUSED#elifdefined(__GNUC__)#defineUNUSED(x)UNUSED_##x__attribute__((unused))#elifdefined(__

c++ - 如何在 cpp 宏中生成换行符?

如何编写扩展为包含换行符的cpp宏? 最佳答案 我正在从事一个大型项目,该项目涉及大量预处理器宏函数来合成任何无法被模板替换的代码。相信我,我熟悉各种模板技巧,但只要没有可以直接创建代码的标准化、类型安全的元编程语言,我们将不得不坚持使用好的旧预处理器及其繁琐的宏来解决一些问题如果没有,则需要编写十倍以上的代码。一些宏跨越多行,在预处理代码中很难阅读。因此,我想到了解决该问题的方法,我想出的是以下内容:假设我们有一个跨多行的C/C++宏,例如在一个名为MyMacro.hpp的文件中//ContentofMyMacro.hpp#inc

c++ - "#ifdef"在宏里面

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:#ifdefinside#define如何在宏中成功使用字符“#”?当我做这样的事情时它会尖叫:#defineDO(WHAT)\#ifdefDEBUG\MyObj->WHAT()\#endif\ 最佳答案 你不能那样做。你必须这样做:#ifdefDEBUG#defineDO(WHAT)MyObj->WHAT()#else#defineDO(WHAT)do{}while(0)#endifdo{}while(0)避免了空语句。见thisquestion,例如。

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

这个问题在这里已经有了答案:C++compilingonWindowsandLinux:ifdefswitch[duplicate](7个回答)关闭9年前.我想检测我正在编译的操作系统是否是Windows。有没有我可以检查的简单宏来验证这一点? 最佳答案 [编辑:我假设您想使用编译时宏来确定您所在的环境。也许您想确定您是在Linux下的Wine上运行还是在Windows上运行,但一般来说,您的编译器针对特定环境,即Windows(DOS)或不是,但很少(从不?)两者。]一些编译器提供宏来指示Windows构建环境。但这些会因编译器而

c++ - 在#define 宏中转义# 符号?

在不涉及血淋淋的细节的情况下,我想使用一个#define宏,该宏将扩展为一个#include但“#”符号会混淆预处理器(如它认为我想引用一个论点。)例如,我想做这样的事情:#defineMACRO(name)#include"name##foo"然后这样使用它:MACRO(Test)这将扩展为:#include"Testfoo"不起眼的#符号导致预处理器出错。MinGW给我以下错误:'#'后面没有宏参数我想我需要转义#符号,但如果这可能的话我不会。是的,宏确实是邪恶的…… 最佳答案 可以将哈希token插入到预处理的token流中。

c++ - 我可以重新定义一个 C++ 宏然后再定义它吗?

我在我的代码中同时使用了JUCE库和一些Boostheader。Juce将“T”定义为宏(groan),而Boost在其模板定义中经常使用“T”。结果是,如果您以某种方式在Boostheader之前包含JUCEheader,则预处理器会在Boost代码中扩展JUCE宏,然后编译器将无可救药地丢失。在大多数情况下保持我的包含顺序正确并不难,但是当您有一个包含其他一些类的JUCE类并且在链的某个位置上的某个文件包含Boost时,它会变得很棘手,如果任何需要JUCE之前的文件包括你有麻烦。我最初希望解决这个问题#undefT在任何包含Boost之前。但问题是,如果我不重新定义它,那么其他代码

c++ - NULL 宏实际上可以是一个 nullptr 吗?

根据标准草案N4713(7.11/1):Anullpointerconstantisanintegerliteral(5.13.2)withvaluezerooraprvalueoftypestd::nullptr_t.和21.2.3/2:ThemacroNULLisanimplementation-definednullpointerconstant.遵循NULL可以定义为nullptr。cppreference上也提到了相同的内容:#defineNULL0//sinceC++11#defineNULLnullptr同时“加法运算符”子句说(8.5.6/7):Ifthevalue0i

c++ - 可以通过参数数量重载宏吗?

this怎么样?工作?如何实现C99/C++11可变参数宏以仅根据为其提供多少参数来扩展为不同的事物? 最佳答案 (编辑:见最后一个现成的解决方案。)要获得一个重载的宏,首先我们需要一个在多个实现之间进行选择的宏。这部分不使用可变参数宏。然后一个通常计算其参数的可变参数宏产生一个选择器。将参数计数插入调度程序会产生一个重载的宏。警告:该系统无法区分零个参数和一个参数,因为没有参数和单个空参数之间没有区别。它们看起来都像MACRO()。要在实现之间进行选择,请将宏连接运算符与一系列类似函数的宏一起使用。#defineselect(se

c++ - Qt:是否可以在使用 foreach 宏进行迭代时删除 QList 元素?

我是Qt的新手,正在努力学习习语。foreachdocumentation说:Qtautomaticallytakesacopyofthecontainerwhenitentersaforeachloop.Ifyoumodifythecontainerasyouareiterating,thatwon'taffecttheloop.但它并没有说明如何在使用foreach进行迭代时删除元素。我最好的猜测是:intidx=0;foreach(constFoo&foo,fooList){if(bad(foo)){fooList.removeAt(idx);}++idx;}似乎很难将idx范围

c++ - 如何使 C++ 宏表现得像函数?

假设由于某种原因您需要编写一个宏:MACRO(X,Y)。(假设您有充分的理由不能使用内联函数。)您希望此宏模拟对没有返回值的函数的调用。示例1:这应该可以按预期工作。if(x>y)MACRO(x,y);do_something();示例2:这不应导致编译器错误。if(x>y)MACRO(x,y);elseMACRO(y-x,x-y);示例3:这应该不编译。do_something();MACRO(x,y)do_something();编写宏的幼稚方法是这样的:#defineMACRO(X,Y)\cout这是一个非常糟糕的解决方案,所有三个示例都失败了,我不需要解释原因。忽略宏的实际作用