草庐IT

c++ - <iterator> 引入的 sys/sysmacros.h 中定义的主要和次要宏

我正在编写一个具有类似矩阵结构的类,并且我希望有一个名为minor的成员函数与矩阵运算相同。这会触发一些错误。我系统上的最小测试用例:#includevoidminor(introw,intcol);编译时,clang提供以下错误:$clang++-Weverything-std=c++11test.cpptest.cpp:2:21:error:toomanyargumentsprovidedtofunction-likemacroinvocationvoidminor(introw,intcol);^/usr/include/x86_64-linux-gnu/sys/sysmacro

c++ - 为什么这个可变参数计数宏在 VC++ 中失败?

我得到了以下实现来获取可变参数宏中的参数数量(目前限制为16个参数)。但是,对于VS2010,无论传递多少参数,输出始终为1。WithGCC,输出是正确的,让我得出结论,我一定错过了MSVC(10)的特定内容。#definePP_NARGS(...)\_xPP_NARGS_IMPL(__VA_ARGS__,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)#define_xPP_NARGS_IMPL(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,N,...)Nintmain(){inti=PP_NARGS

c++ - 为什么这个可变参数计数宏在 VC++ 中失败?

我得到了以下实现来获取可变参数宏中的参数数量(目前限制为16个参数)。但是,对于VS2010,无论传递多少参数,输出始终为1。WithGCC,输出是正确的,让我得出结论,我一定错过了MSVC(10)的特定内容。#definePP_NARGS(...)\_xPP_NARGS_IMPL(__VA_ARGS__,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)#define_xPP_NARGS_IMPL(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,N,...)Nintmain(){inti=PP_NARGS

c++ - <stddef.h> 中的 'offsetof' 宏是否会调用未定义的行为?

MSVC的实现示例:#defineoffsetof(s,m)\(size_t)&reinterpret_cast((((s*)0)->m))//^^^^^^^^^^^可以看出,它取消引用一个空指针,这通常会调用未定义的行为。这是规则的异常(exception)还是发生了什么? 最佳答案 如果语言标准说“未定义的行为”,任何给定的编译器都可以定义该行为。标准库中的实现代码通常依赖于此。所以有两个问题:(1)代码相对于C++标准是UB吗?这是一个非常困难的问题,因为这是一个众所周知的几乎缺陷,C++98/03标准从未在规范性文本中明确指

c++ - <stddef.h> 中的 'offsetof' 宏是否会调用未定义的行为?

MSVC的实现示例:#defineoffsetof(s,m)\(size_t)&reinterpret_cast((((s*)0)->m))//^^^^^^^^^^^可以看出,它取消引用一个空指针,这通常会调用未定义的行为。这是规则的异常(exception)还是发生了什么? 最佳答案 如果语言标准说“未定义的行为”,任何给定的编译器都可以定义该行为。标准库中的实现代码通常依赖于此。所以有两个问题:(1)代码相对于C++标准是UB吗?这是一个非常困难的问题,因为这是一个众所周知的几乎缺陷,C++98/03标准从未在规范性文本中明确指

c++ - 为什么 Clang 不喜欢 __DATE__ 宏?

我使用__DATE__宏来获取编译时年份:constQStringbuild_year=__DATE__+7;QtCreator中的Clang代码模型会因使用__DATE__宏而引发-Wdate-time警告。警告:日期或时间宏的扩展不可重现我可以使用-Wno-date-time禁用此警告,但使用__DATE__有什么问题?什么是宏的“扩展”,怎么可能是“可重现”或“不可重现”,为什么“不可重现”不好? 最佳答案 从许多角度来看,重复构建复制二进制相同的输出是可取的。从每次提供不同二进制文件的相同工具链构建相同的源代码可能会隐藏严重

c++ - 为什么 Clang 不喜欢 __DATE__ 宏?

我使用__DATE__宏来获取编译时年份:constQStringbuild_year=__DATE__+7;QtCreator中的Clang代码模型会因使用__DATE__宏而引发-Wdate-time警告。警告:日期或时间宏的扩展不可重现我可以使用-Wno-date-time禁用此警告,但使用__DATE__有什么问题?什么是宏的“扩展”,怎么可能是“可重现”或“不可重现”,为什么“不可重现”不好? 最佳答案 从许多角度来看,重复构建复制二进制相同的输出是可取的。从每次提供不同二进制文件的相同工具链构建相同的源代码可能会隐藏严重

c++ - 使用 Doxygen 在 C++ 中记录宏函数

如何使用Doxygen在C++中记录宏函数,并在我的非Evil代码的文档中引用它?更具体地说,我在Message.H中定义了一些名为“Message”的常规类,用户可以从中继承来定义自己的消息。在另一个文件(“MessageHelpers.H”)中,我有一个像这样的疯狂宏://!Usersmustcallthismacrotoregistertheirmessages.../*!...lesttheybeforcedtotypeallsortsofboringanderror-proneboilerplatecode.blahblahblah...Morespecificdocumen

c++ - 使用 Doxygen 在 C++ 中记录宏函数

如何使用Doxygen在C++中记录宏函数,并在我的非Evil代码的文档中引用它?更具体地说,我在Message.H中定义了一些名为“Message”的常规类,用户可以从中继承来定义自己的消息。在另一个文件(“MessageHelpers.H”)中,我有一个像这样的疯狂宏://!Usersmustcallthismacrotoregistertheirmessages.../*!...lesttheybeforcedtotypeallsortsofboringanderror-proneboilerplatecode.blahblahblah...Morespecificdocumen

c++ - 零参数的可变参数宏

我正在处理调用宏,#defineCALL(f,...)FN(f)->call((ref(newLinkedList()),__VA_ARGS__))调用时,CALL(print,2,3,4,5);将2345添加到链表(为此已重载)并调用print期望链表按预期工作但是有一些调用不需要参数,CALL(HeapSize);它仍然需要一个链接列表,但是一个空列表,上面不起作用,我正在尝试提出一个可以与任何一种样式一起使用的宏?编辑:通过gcc文档挖掘我发现在VA_ARGS之前添加##会删除,当没有参数但我无法嵌套宏时,CALL(print,CALL(HeadSize));这会导致CALL未定