草庐IT

define-ing

全部标签

c++ - 为什么#define 不好,什么是合适的替代品?

#definedItemNameL"CellPhone" 最佳答案 将其定义为常量变量。这是一个很好的编程习惯。constwchar_t*dItemName=L"CellPhone";如果您稍后需要知道字符串的长度,则将其定义为数组:constwchar_tdItemName[]=L"CellPhone";此外,为什么#define不好:它将所有使用单词dItemName的地方转换为L"CellPhone"。示例:struct{intdItemName;}SomeStruct;将失效:struct{intL"CellPhone";}

c++ - C++ 中的 static const 与 #define - 可执行文件大小的差异

我的基本情况:我有一个包含类似#definefoo(Flag1|Flags2|Flag3)的包含文件,因此它是位标志的预定义组合。为了类型安全,我想用静态常量替换这些#defines,即staticconstintfoo=(Flag1|Flag2|Flag3)(或类似的)。这个包含文件包含在程序的几十个地方。现在,当我在启用所有相关优化选项(使用VS2010的C++编译器)的情况下进行发布构建时,替换#defines似乎会使可执行文件增加几个KiB,具体取决于我替换了多少常量。为什么会这样?据我所知,如果可能的话,整数常量应该“内联”到生成的ASM代码中,我看不出如何使用staticc

c++ - #define hell C/C++ 的替代品/工具

在我们的C/C++项目中,我们使用一个充满#ifdef和#defines的配置header(~1000行)#if(defined(HW_1)||defined(SOME_TECHNOLOGY_SUPPORTED))&&defined(OTHER_TECHNOLOGY_SUPPORTED)#defineSOME_FEATURE_AVAILABLE#endif在我们的构建配置中,我们预定义了一些传递给编译器的定义。这会在我们的配置header中产生不同的定义(如SOME_FEATURE_AVEILABLE)。由于我们的配置头很大,所以也有点乱。对于这个#definehell,是否有任何替代

c++ - 自动返回类型扣除警告 : why do we need decltype when return defines the type anyway?

这是一个关于elementsSize()成员函数做什么的问题,关于自动返回类型推导:#include#includetemplateclassElementVector{std::vectorelementVec_;//Otherattributes.public:ElementVector()=default;ElementVector(conststd::initializer_list&list):elementVec_(list){}autoelementsSize()//->decltype(elementVec_size()){returnelementVec_.size(

c++ - "#define new DEBUG_NEW"和 "#undef THIS_FILE"等真的有必要吗?

当您创建新的MFC应用程序时,向导会在几乎每个CPP文件中创建以下代码块:#ifdef_DEBUG#definenewDEBUG_NEW#endif有时它还会添加:#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;如果这段代码是多余的,我想从我的CPP文件中删除它。我在VS2008上使用带有C++/CLI的MFC应用程序。从CPP中删除这段代码后,我尝试在Debug中运行,它似乎工作正常。"new"变量工作正常,没有泄漏,ASSERT对话框显示正确的文件名并跳转到有问题的行。谁能告诉我它的作用以及删除它是否安全? 最

c++ - 在没有 #define 的情况下捕获 __LINE__ 和 __FILE__

尝试确定以下C风格代码的“现代”实现:#definelogError(...)log(__FILE__,__LINE__,__VA_ARGS__)是否可以使用不依赖于#define的可变参数模板或类似的东西来捕获它?所需用例:logError("Ohno!Anerroroccurred!");__FILE__和__LINE__是在后台捕获的,但反射(reflect)了调用logError的文件名和行号。 最佳答案 宏确实是您唯一的选择,至少在std::source_location之前是这样。使其成为标准并满足您的愿望。

c++ - 在 C++ 中使用 "#define"的替代方案?为什么会被人嫌弃?

我开发C++还不到一年,但在那段时间里,我听到很多人谈论#define有多么可怕。现在,我意识到它是由预处理器而不是编译器解释的,因此无法调试,但这真的那么糟糕吗?这是一个示例(未经测试的代码,但您已经了解了大致的想法):#defineVERSION"1.2"#includeclassFoo{public:stringgetVersion(){return"Thecurrentversionis"+VERSION;}};为什么这段代码不好?是否有使用#define的替代方法? 最佳答案 Whyisthisthiscodebad?因为

c++ - #define值的大小

如果一个值被定义为#defineM_4040大小是否与short(2字节)相同,还是与char(1字节)或int(4字节)?大小取决于您是32位还是64位? 最佳答案 #define没有大小,因为它不是类型,而是对C++代码的纯文本替换。#define是一个预处理指令,它甚至在您的代码开始编译之前运行。替换后C++代码的大小与您那里的C++表达式或代码的大小无关。例如,如果您使用L作为后缀,例如102L,那么它会被视为long,否则没有后缀,只是一个int。所以在x86和x64上可能是4个字节,但这取决于编译器。也许C++标准的In

c++ - 自动化 C++ 类的 pimpl'ing——有简单的方法吗?

Pimpl是许多C++代码中样板的来源。它们似乎是宏、模板和一些外部工具的组合可以帮助解决的问题,但我不确定最简单的方法是什么。I'veseentemplates这有助于完成一些提升,但作用不大——您最终仍然需要为您尝试包装的类的每个方法编写转发函数。有没有更简单的方法?我正在想象一个工具用作制作过程的一部分。你希望你的公共(public)头文件是pimpl'd类,所以你提供一些输入文件,比如pimpl.in,它列出了你想要包装的类(实现的非pimpl'd),然后检查该文件,生成pimpl类,并且在“makeinstall”期间仅安装它们的header(不是原始类的header)。问题

c++ - 可以将#defines 列表转换为字符串

假设我在外部库的头文件中有一个#define列表。这些#define表示从函数返回的错误代码。我想编写一个转换函数,它可以将错误代码作为输入并返回表示实际#define名称的字符串文字作为输出。举个例子,如果我有#defineNO_ERROR0#defineONE_KIND_OF_ERROR1#defineANOTHER_KIND_OF_ERROR2我想要一个可以像这样调用的函数interrorCode=doSomeLibraryFunction();if(errorCode)writeToLog(convertToString(errorCode));并且让convertToStri