草庐IT

c++ - 自定义 C++ 断言宏

我偶然发现了一篇内容丰富的文章:http://cnicholson.net/2009/02/stupid-c-tricks-adventures-in-assert/它指出了我当前的调试宏套件中存在的大量问题。如果您点击链接,最终版本的宏的完整代码将在文章末尾附近提供。呈现的一般形式是这样的(如果我在转置它时错了,请有人纠正我):#ifdefDEBUG#defineASSERT(cond)\do\{\if(!(cond))\{\ReportFailure(#cond,__FILE__,__LINE__,0);\HALT();\}\}while(0)#else#defineASSERT(

c++ - 可变参数宏是非标准的吗?

对于调试构建,我通常使用Clang,因为它可以更好地格式化警告和错误,并且更容易跟踪和修复它们。但最近在添加了带有可变参数的宏后,Clang告诉我以下内容(来自一个虚拟项目):main.cpp:5:20:warning:namedvariadicmacrosareaGNUextension[-Wvariadic-macros]#definestuff3(args...)stuff_i(args)我知道macroname(args...)在各种编译器中都能很好地编译,包括Visualstudio、Sunstudio,当然还有GCC。但是为了确保clang是正确的,我尝试了另外两种扩展可变

c++ - 可变参数宏是非标准的吗?

对于调试构建,我通常使用Clang,因为它可以更好地格式化警告和错误,并且更容易跟踪和修复它们。但最近在添加了带有可变参数的宏后,Clang告诉我以下内容(来自一个虚拟项目):main.cpp:5:20:warning:namedvariadicmacrosareaGNUextension[-Wvariadic-macros]#definestuff3(args...)stuff_i(args)我知道macroname(args...)在各种编译器中都能很好地编译,包括Visualstudio、Sunstudio,当然还有GCC。但是为了确保clang是正确的,我尝试了另外两种扩展可变

c++ - 空函数宏

如果我定义一个没有实际主体的函数宏,它是否像编译器的空字符串(即它在编译时不会生成任何额外指令)?例子:#defineSomeMacro(a)SomeMacro("hello");//Thislinedoesn'taddanyinstructions,doesit? 最佳答案 您说的完全正确,空宏不会生成任何代码。我见过两个有用的地方。第一个是在不使用函数参数时消除警告:#defineUNUSED(x)intfoo(intUNUSED(value)){return42;}第二个是当你使用条件来确定是否应该有代码时。#ifdefLOG

c++ - 空函数宏

如果我定义一个没有实际主体的函数宏,它是否像编译器的空字符串(即它在编译时不会生成任何额外指令)?例子:#defineSomeMacro(a)SomeMacro("hello");//Thislinedoesn'taddanyinstructions,doesit? 最佳答案 您说的完全正确,空宏不会生成任何代码。我见过两个有用的地方。第一个是在不使用函数参数时消除警告:#defineUNUSED(x)intfoo(intUNUSED(value)){return42;}第二个是当你使用条件来确定是否应该有代码时。#ifdefLOG

C++ 连接 __FILE__ 和 __LINE__ 宏?

我希望我的异常消息包含有关异常位置的信息。所以我想要一些类似的东西。#defineLOCATION__FILE__":"__LINE__throwstd::exception(std::string("ABCD.")+LOCATION);这个定义显然是不正确的。如何做到这一点? 最佳答案 您需要将该宏扩展为两个级别:#defineS1(x)#x#defineS2(x)S1(x)#defineLOCATION__FILE__":"S2(__LINE__)原因如下:您需要将__LINE__扩展为两个级别,然后将其传递给#x。首先,在fu

C++ 连接 __FILE__ 和 __LINE__ 宏?

我希望我的异常消息包含有关异常位置的信息。所以我想要一些类似的东西。#defineLOCATION__FILE__":"__LINE__throwstd::exception(std::string("ABCD.")+LOCATION);这个定义显然是不正确的。如何做到这一点? 最佳答案 您需要将该宏扩展为两个级别:#defineS1(x)#x#defineS2(x)S1(x)#defineLOCATION__FILE__":"S2(__LINE__)原因如下:您需要将__LINE__扩展为两个级别,然后将其传递给#x。首先,在fu

c++ - NDEBUG 预处理器宏用于(在不同平台上)是什么?

我对各种平台/编译器(“实现”)/框架分配给C和C++预处理器宏NDEBUG的用途感兴趣。C和C++标准只提到过一次这个定义,即控制assert()宏的行为。我会要求只包含具体的答案,您知道C或C++的某个平台/框架/库使用NDEBUG定义启用或禁用任何其他除了标准定义的assert()宏。提出这个问题的一个原因是MS(Visual-C++)总是(?)使用“他们的”_DEBUG定义来区分调试和发布的东西,我想知道这是否是库/平台拥有“自己的”调试定义的常见做法,或者其他库/平台是否使用NDEBUG进行与调试相关的东西。 最佳答案 关

c++ - NDEBUG 预处理器宏用于(在不同平台上)是什么?

我对各种平台/编译器(“实现”)/框架分配给C和C++预处理器宏NDEBUG的用途感兴趣。C和C++标准只提到过一次这个定义,即控制assert()宏的行为。我会要求只包含具体的答案,您知道C或C++的某个平台/框架/库使用NDEBUG定义启用或禁用任何其他除了标准定义的assert()宏。提出这个问题的一个原因是MS(Visual-C++)总是(?)使用“他们的”_DEBUG定义来区分调试和发布的东西,我想知道这是否是库/平台拥有“自己的”调试定义的常见做法,或者其他库/平台是否使用NDEBUG进行与调试相关的东西。 最佳答案 关

C++:宏可以将 "abc"扩展为 'a' 、 'b' 、 'c' 吗?

我写了一个可变参数模板,它接受可变数量的char参数,即templatestructFoo;我只是想知道是否有任何宏技巧可以让我使用类似于以下的语法来实例化它:Foo或Foo或Foo等等基本上,任何能阻止你单独写字符的东西,就像这样Foo这对我来说不是什么大问题,因为它只是一个玩具程序,但我想我还是会问。 最佳答案 我今天创建了一个,并在GCC4.6.0上进行了测试。#include#defineE(L,I)\(I\cstring,sizeofL-1>::type#defineCSTR(L)STR(cstring,L)templat