草庐IT

c++ - 宏重复几乎相同的代码

我必须根据编译时常量参数编写相同的代码,例如:map["text0"]=vec[0];map["text1"]=vec[1];...map["textn"]=vec[n];问题是我在编写代码时不知道n,我将其作为模板参数接收。显而易见的解决方案是使用一个循环并在循环内生成"textk"并使用vec[k],但是当它应该在编译时间。另一种解决方案是针对不同的N值专门化该函数,但这样我将不得不多次手动编写相同的代码,并且没有理由将其设为模板。我知道有一些智能宏可以将类似的事情重复N次(例如BOOST_PP_REPEAT宏系列),但我找不到针对我的特定问题的解决方案。你有解决这个问题的方法吗?

c++ - 为什么在类声明中使用宏

我正在阅读leveldb的源代码,特别是。关于互斥锁。我找到了这个声明:classSCOPED_LOCKABLEMutexLock{public:explicitMutexLock(port::Mutex*mu)EXCLUSIVE_LOCK_FUNCTION(mu):mu_(mu){this->mu_->Lock();}~MutexLock()UNLOCK_FUNCTION(){this->mu_->Unlock();}private:port::Mutex*constmu_;//NocopyingallowedMutexLock(constMutexLock&);voidoperat

c++ - _T( ) 宏更改为 UNICODE 字符数据

我有一个UNICODE应用程序,我们使用_T(x)定义如下。#ifdefined(_UNICODE)#define_T(x)L##x#else#define_T(x)x#endif我知道L被定义为wchar_t,它在任何平台上都是4个字节。如果我错了,请纠正我。我的要求是我需要L为2个字节。因此,作为编译器hack,我开始使用-fshort-wchargcc标志。但现在我需要将我的应用程序移动到zSeries,在该平台上我看不到-fshort-wchar标志的效果。为了能够在zSeries上移植我的应用程序,我需要修改_T()宏,即使在使用L##x并且不使用-fshort-wchar标

c++ - 将字符串宏/常量转换为宽字符/Unicode

我有一个使用第3方库的UnicodeWin32应用程序,其中一些库为它们的版本信息提供常量作为#defined(窄)字符串。例如,libpng具有以下内容:#definePNG_LIBPNG_VER_STRING"1.5.4"#definePNG_HEADER_VERSION_STRING\"libpngversion1.5.4-July7,2011\n"我将各种静态链接的库版本信息附加到我的关于框以便于版本跟踪,并且将此常量转换为宽字符串似乎很简单。我的第一次尝试是TEXT(PNG_HEADER_VERSION_STRING),但失败了#define__TEXT(quote)L##q

c++ - 如何检索 C99 可变参数宏的最后一个参数?

VisualStudio针对失败的static_assert的错误消息完全由错误代码和static_assert的第二个参数组成,没有任何其他消息表明它是静态断言失败。我想做一个宏来解决这个问题。例如,作为第一次尝试:#defineSTATIC_ASSERT(x)static_assert(x,"staticassertionfailed:"#x)您遇到的第一个问题是C预处理器不理解作为封闭的定界符,这会导致模板出现语法错误。以下内容变为非法:templateautoSafeMultiply(Tx,Uy)->decltype(x*y){STATIC_ASSERT(std::is_sam

c++ - 不使用 USES_CONVERSION 宏

我的这段代码在C++项目中使用了USE_CONVERSION宏...我想知道这是否写得好(不是我写的),如果没有USES_CONVERSION和W2A宏,是否有更好的方法。STDMETHODIMPCInterpreter::GetStringVar(BSTRbstrNamespace,BSTRbstrVar,BSTR*pbstrValue){USES_CONVERSION;try{if(!pbstrValue)returnE_POINTER;char*pszNamespace=W2A(_bstr_t(bstrNamespace).operatorwchar_t*());char*psz

c++ - __COUNTER__ 宏是否可移植?

我有一段代码使用__COUNTER__宏来为变量生成唯一的名称。此代码可移植吗?我知道GCC和MSVS支持它。其他编译器呢?宏是由标准定义的吗(据我所知,在C++14之前它不是)。 最佳答案 这绝对不标准。这是一个编译器扩展(GNUCextensions)ThecommonpredefinedmacrosareGNUCextensions.和一个Microsoft-specificone,Microsoft-SpecificPredefinedMacros:__COUNTER__还支持clang作为语言扩展。Thestandardd

c++ - 来自 Essential COM 的 BASE_OFFSET 宏

我正在阅读EssentialCOM并遇到了该书第2章中的宏“BASE_OFFSET”,但我并不真正理解它的语法或为什么这样做。#defineBASE_OFFSET(ClassName,BaseName)\(DWORD_PTR(static_cast(reinterpret_cast(0x10000000)))-0x10000000)谁能解释一下这个宏以及我们如何使用它?事实上,这本书使用了这个宏,但由于我不太了解它,所以我没有看到它的实际用法。非常感谢您。 最佳答案 该宏使用reinterpret_cast构建一个指向ClassNa

c++ - 如何通过宏检查是否使用了 GNU libstdc++?

如何通过宏检查是否使用了(GNUGCC)libstdc++STL实现?那可能吗?我希望它在GCC和Clang中都能工作。对于Linux上的C++11,它可能是唯一的选择(或者是?)。(STLport不支持C++11,AFAIK。)在MacOSX上,(LLVM)libc++STL更有可能,如果你使用Clang(可能也用于GCC,不确定)。 最佳答案 您可以检查__GLIBCXX__(或__GLIBCPP__,对于3.4.0之前的版本)宏是否存在,包括一个C++标准包含文件(cstddef是一个不错的选择):#include#ifdef

c++ - 如何通过 doxygen 扩展宏,但没有记录为定义?

假设我有:#defineMY_MACRO(FOO)voidFOO();MY_MACRO(hi);MY_MACRO(hey);MY_MACRO(hello);#undefMY_MACRO我希望通过doxygen扩展宏,我可以通过正确的方式配置它来实现:ENABLE_PREPROCESSING=YESMACRO_EXPANSION=YESEXPAND_ONLY_PREDEF=YESEXPAND_AS_DEFINED=MY_MACRO这使我能够在doxygen输出中看到宏的扩展结果作为记录的API(函数hi、hey和hello).到目前为止一切都很好。但问题是,doxygen也将MY_MAC