我继承了C/C++代码库,在许多.cpp文件中,#include指令被包装在#ifndef中,header内部单个包含#define。例如#ifndef_INC_WINDOWS#include#endif和windows.h看起来像#ifndef_INC_WINDOWS#define_INC_WINDOWS...headerfilestuff....#endif//_INC_WINDOWS我假设这样做是为了加快代码的编译/预处理。我认为这是一个丑陋的过早优化,但由于该项目从清理开始有5分钟的构建时间,我不想让事情变得更糟。那么这种做法是否会增加任何值(value)或加快速度?清理它们可
我有一个字符串的宏如下:#defineAPPNAME"MyApp"现在我想使用这个宏构造一个宽字符串,方法如下:constwchar_t*AppProgID=APPNAMEL".Document";但是,这会产生“连接不匹配的字符串”编译错误。有没有办法将APPNAME宏转换为宽字符串文字? 最佳答案 你试过吗#defineAPPNAME"MyApp"#defineWIDEN2(x)L##x#defineWIDEN(x)WIDEN2(x)constwchar_t*AppProgID=WIDEN(APPNAME)L".Document
我有一堆C++代码中的MACROS,可以扩展成一些函数。我正在调试一些东西。只是想看看代码最终是什么样子的”有什么想法吗? 最佳答案 您可以查看预处理器输出以查看代码经过预处理后的样子。如果您在命令行上将-E标志传递给编译器,gcc和VisualC++都将预处理为stdout。 关于C++宏展开、调试,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2701533/
我的电脑上安装了两个版本的C++编译器。其中一个可以识别__COUNTER__宏,而另一个则不能。在做了一些研究以使程序在两者中编译之后,我还没有遇到__COUNTER__的宏定义。这是编译器完成的一些特殊宏,还是我可以将__COUNTER__的定义复制到我的源代码中,如果我可以复制它,我需要什么代码。 最佳答案 __COUNTER__是几个常见编译器中的内置项。无法手动定义。如果您遇到不支持它的编译器,最好的选择可能是在将代码送入编译器之前通过支持它的预处理器运行您的代码。 关于C++
由于某种我无法解释的原因,编译器正在输出一个错误,指出它发现了一个意外的#else标记。这发生在文件的开头:#ifdefined(_USING_MFC)#include"stdafx.h"#else#include#endif在那段代码之前没有任何东西需要多个(单行)注释。此错误发生在.cpp文件中。您在上面看到的是文件的开头。在此之前什么都没有。我尝试在上面定义的代码之前添加以下代码,现在错误是意外的#endif#if1#include"stdafx.h"#endif所以我怀疑包含以下代码的stdafx.h文件存在问题:#ifndefSTDAFX_H_INCLUDED#defineS
我在我的C++程序中使用了一个外部库。这个库有一个名为“Common.h”的文件。在不知道这个文件的情况下,我还在我的程序中创建了一个“Common.h”。在header中使用编译器标志“#pragmaonce”我可以确保这两个文件都可以包含在编译中。但是,我意识到当我在程序中调用“Common.h”时,预处理器错误地包含了外部库中的“Common.h”,这会破坏编译。有没有像“命名空间”这样的选项可以让我包含正确的文件。我发现这真的很难,因为我们可能不知道(实际上不需要)外部库中的所有文件。 最佳答案 通常程序有几个所谓的包含路径
我正在做一些模板元编程,大部分只是编写我自己的编译时间列表,但我也有一些预处理器魔法,如果可能的话,我想用它来使事情变得更容易。我想做的是创建仿函数的编译时列表。该部分已完成,但用于简化创建(并添加到列表)的宏尚未完成。一个简单的例子:templatestructnode{typedefFunctorhead;typedefTailtail;};templatestructpush_back{typedefnodelist;};structunit0{};#defineAUTO_FUNCTION(name)structtest_functor_##name{\staticvoidrun
我在代码语句周围使用了一个宏,以引入嵌套异常处理:#defineTRAP_EXCEPTION(statement)\try\{\try{statement}\catch(Engine::Exception&e)\{\throwMyException(e.message());\}\}在一个案例引发编译器错误之前,它一直运行良好。我设法构建了一个最小的例子:TRAP_EXCEPTION(std::mapMap;)catch(MyException&e){}这会产生以下错误...我该如何修复它(最好是在宏中)?>errorC2143:syntaxerror:missing'>'before
定义我的问题的最简单方法是我正在尝试实现一种机制来检查是否已经使用了相同的字符串(或一对(数字,字符串))。我希望使用C预处理器以一种巧妙的方式实现这种机制。我还希望这种机制在Debug模式下存在冲突或运行时错误时给我编译错误(通过检查断言)。我们不希望开发人员在添加消息时出错,因为每条消息都应该是唯一的。我知道这可以通过计算哈希或例如crc/md5来完成,但这种机制很容易发生冲突,我需要避免。至关重要的是,每条消息只能使用一次。此机制的示例行为:addMessage(1,"Message1")//OKaddMessage(2,"Message2")//OK...addMessage(
我试图将一个简单的错误记录合并到我现有的应用程序中,目前它仅使用cout报告错误所以我希望使用保持类似的界面运算符(operator)。但是我希望它记录该行并运行发生的错误,但我不想输入__LINE__,__FUNCTION__每次我需要登录。有谁知道我可以用来允许__LINE__的技巧吗?要在另一个函数中使用的宏,而不是报告调用行?希望这是有道理的。classmyLogClass{uint8_tlevel;public:booloperator而不是每次都这样myLogClass我只想能够做到:myLogClass 最佳答案 my