草庐IT

c++ - 用于静音未使用变量警告的跨平台宏

在将一大段C++代码从VisualStudio(2008)移植到Xcode(4.4+)时,我遇到了如下行:UNUSED_ALWAYS(someVar);UNUSED_ALWAYS(x)(通过UNUSED(x))宏扩展为x,这似乎使VisualC++静音。然而,这对Clang来说还不够。对于Clang,我通常使用#pragmaunusedx指令。UNUSED_ALWAYS和UNUSED宏是在我控制的人造windows.hheader中定义的,它包含许多实用程序来帮助Xcode编译Windows的东西。有没有办法定义UNUSED(x)来展开成#pragmaunusedx?我试过这个,但Cl

C++ 模板宏快捷方式

通常在使用模板时,您最终会得到类似这样的东西:templateclassthe_class{public://typestypedefTvalue_type;typedefconstvalue_typeconst_value_type;typedefvalue_type&reference;typedefconst_value_type&const_reference;typedefvalue_type*pointer;typedefconst_value_type*const_pointer;...};不过,这是很多相同的东西,被复制到许多不同的模板化类中。是否值得创建如下内容://

c++ - 预处理器宏扩展到另一个预处理器指令

起初我以为我需要这个,但我最终避免了它。然而,我的好奇心(以及求知欲,嗯)让我问:可以预处理器宏,例如在#include"MyClass.h"INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass)扩展到另一个包含,例如#include"MyClass.h"#include"FooTemplate.h"templateclassFooTemplate;? 最佳答案 我相信这是不可能的,这是因为预处理器是单channel。因此它不能发出其他预处理器指令。具体来说,来自C99标准(6.10.3.4第3段):3The

C++在宏条件中获取类型的大小

有没有办法在C++中做这样的事情,似乎出于某种原因不能在那里使用sizeof?#ifsizeof(wchar_t)!=2#error"wchar_tisexpectedtobea16bittype."#endif 最佳答案 不,这是不可能完成的,因为所有宏扩展(#...东西)都是在预处理器步骤中完成的,它对C++代码的类型一无所知,甚至不需要知道任何东西关于语言!它只是扩展/检查#...的东西,没有别的!还有一些其他的常见错误,例如:enumXY{MY_CONST=7,};#ifMY_CONST==7//ThiscodewillNE

c++ - 应用一些基本宏来简化大型项目中的代码是个好主意吗?

我已经在基础C++库上工作了一段时间,我有各种各样的想法可以真正简化代码编写和管理过程。其中之一是引入一些宏的概念,以帮助简化经常出现但比应有的要复杂一些的语句。例如,我提出了这个基本宏来简化最常见的for循环类型:#defineloop(v,n)for(unsignedlongv=0;v这将使您能够替换那些您经常看到的笨重的for循环:for(inti=0;i有了更容易编写,甚至更高效的东西:loop(i,max_things)像这样使用约定是个好主意吗?使用不同类型的编译器时是否会遇到任何问题?对于不熟悉宏的人来说会不会太困惑了? 最佳答案

c++ - 这个宏可以转换成一个函数吗?

在重构代码并摆脱所有那些我们现在被教导讨厌的#defines时,我遇到了用于计算结构中元素数量的这种美:#defineSTRUCTSIZE(s)(sizeof(s)/sizeof(*s))虽然非常有用,但可以将其转换为内联函数或模板吗?好吧,ARRAYSIZE会是一个更好的名字,但这是遗留代码(不知道它来自哪里,它至少有15年历史了)所以我“按原样”粘贴了它。 最佳答案 如前所述,代码实际上计算出数组中元素的数量,而不是结构中的元素数。我会在需要时明确写出sizeof()分区。如果我要使它成为一个函数,我想在它的定义中明确指出它需要

c++ - Posix 是否为 printf/scanf 提供格式字符串宏?

C中的printf和scanf函数族使用少量与基本数据类型相对应的原始格式说明符–%d对于int,%llu对于unsignedlonglongint等但是,有大量的标准化类型别名可供实践使用,例如int32fast_t,而我们不能也不应该知道底层的基本类型。对于stdint.h中的别名,幸运的是C标准在inttypes.hPRI32.是否有一组类似的Posix宏?Posix有大量的不透明类型,如ssize_t、pid_t、rlim_t、suseconds_t等,它们都是基于基本的整数类型。如何在格式字符串中可移植地使用这些类型? 最佳答案

c++ - 如何逐步查看宏扩展?

好像Eclipseallowsuserto"seetheexpansionStep-by-Step"bypressingF2.我喜欢这个很棒的功能。但是我可以只用gcc或clang(或任何工具)做同样的事情吗?-E选项使所有宏都完全展开。所以我还没有找到任何替代方法来逐步扩展宏。Eclipse很大。我希望我不需要到处安装它并让它一直启动。 最佳答案 这是Eclipse中内置的功能。如果此类工具作为GCC或Clang工具链的一部分提供,则Eclipse将无需实现它。这样的功能可以使用MELT作为GCC的扩展来实现。.LLVM(Clan

c++ - 多行原始字符串文字作为预处理器宏参数

多行原始字符串文字可以作为预处理器宏的参数吗?#defineIDENTITY(x)xintmain(){IDENTITY(R"()");}此代码无法在g++4.7.2和VC++11(Nov.CTP)中编译。是编译器(词法分析器)错误吗? 最佳答案 多行宏调用是合法的——由于您使用的是原始字符串文字,因此它应该已编译有一个已知的GCC错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52852如果您使用的是常规(非原始)字符串,那将是非法的。这应该已经编译:printf(R"HELLOWOR

c++ - 是否可以像在 C# 中那样使用 C++ 中的宏创建 "extension methods"?

我想扩展std::string并添加“等于”。所以我做了以下事情:#defineEquals(str1)compare(str1)==0并使用了以下代码:if(str.Equals("hhhhllll"))哪个(我假设)编译为if(str.compare("hhhhllll")==0)一切都编译得很好。现在我想改进我的宏,添加括号编译为if((str.compare("hhhhllll")==0))我试过类似的东西:#define(str).Equals(str1)(str.compare(str1)==0)但它不会编译(宏根本不适合)我怎样才能实现它? 最