简单的方法来禁用部分代码
这不是一个解决具体问题的典型问题,而是一个大脑的练习,但是我想知道有没有人有解决方法。
在开发中,我们经常需要禁用或切换代码的某些部分来检查不同的方法。 要做到这一点,我们使用评论或#defines
,但我最喜欢的是:
//* [code here] //*/
现在,当您删除第一个斜杠时,代码将被注释掉。
问题是否有任何方法来实现类似的if-else代码开关? 我试图find它,但我总是有一些问题,找不到一个工作的解决scheme。
也许你知道任何类似的技巧?
我不确定我应该发布这个,因为这不是我认为是“好代码”的东西,但我会承认已经使用了下面的技术作为快速n-dirty的方式来快速切换两个小片段的代码,当我只是检查出来的东西:
// in the following , foo() is active: /**/ foo(); /*/ bar(); /**/
现在只要删除前面的星号之一:
// now bar() is active: /*/ foo(); /*/ bar(); /**/
当然,这绝对不能超过“只是检查一下”的阶段。
使用#if 0
包装代码就可以了,但是你仍然需要编辑代码来启用/禁用代码。 这不仅仅是使用注释块。
请注意,您也可以使用定义的预处理器常量:
#ifdef ENABLE_TESTS // code that you want to run ONLY during tests #endif
现在,在构build代码时,可以在构build过程中有select地定义/取消定义这个常量 – IDE / makefile / build脚本/命令行 – 无需编辑代码:
$ gcc -DENABLE_TESTS source.c
我已经添加了这个答案来平衡所有早期的#if 0
答案,但是这个来自被接受的答案的构造是特定问题的最佳答案: /**/ foo(); /*/ bar(); /**/
/**/ foo(); /*/ bar(); /**/
/**/ foo(); /*/ bar(); /**/
。 请谨慎使用这样的评论技巧。
#if 0 ...disabled code here #endif
预处理器if-else也可以
#if 1 // ... enabled if 1 #else // ... enabled if 0 #endif
有时我使用下面的技巧在两个懒惰的评论之间切换。
//* <-- remove the first slash [code block 1] /*/ [code block 2] //*/
那么,如果代码在完成之前需要被禁用一 两次 ,那么我更喜欢使用IDE提供的热键来将代码注释掉,然后再进行注释。是的,我需要先select代码块,但是我不喜欢每次需要禁用一部分代码时,再包含一个debuggingvariables/预处理器指令/ if语句。 这发生在大部分时间。
另一方面,如果我需要在2个代码块之间反复切换以find正确的东西,那么我使用if (0)
/ if (1)
来禁用/启用代码块。
[code block 1]
后来
if (0) { [code block 1] } else { [code block 2] }
使用一些预处理器逻辑来帮助你在这里:
#if 0 //code goes here #endif
请享用
如果您在编译时进行检查,则可以使用Gigi的答案,它将有条件地不编译代码段。 请注意,预处理器不知道variables,或sizeof,或其他事情由编译器处理(所以使用像4 == sizeof(int)
不会飞)
如果你想编译一些不应该运行的debugging代码,那么你可以使用普通的条件语句,就像这样
bool debugging = false; // banana banana banana if (debugging) { // do a bunch of stuff here }
然后,您可以使用debugging器通过将debugging
分配给true来访问跳过的部分。
macros是这样做的方式..
#define COMPILE #ifdef COMPILE //code to comment begins cout<<"ha ha ha"<<endl; //code to comment ends #endif
要禁用代码,只需注释#define编译行即可
1 ? foo() : bar();
这执行foo()
。 将1
更改为0
来代替执行bar()
。
与涉及预处理器指令或注释的build议不同,两个可能的分支都被编译,所以您可以充分利用编译器的语法检查。
同时打开/closures程序中分散的代码块有时也是需要的。
受格雷厄姆之前的这篇文章的启发,我制作了这样的东西:
void doNothing(){} #define DO_IF(flag, code) flag ? code : doNothing();
这可以例如如下使用:
DO_IF(collectStats, recordStats()); DO_IF(collectStats, store(pullStat()));
一个更好:
#define DO_IF(flag,code) if( flag ) { code; }
以下逻辑应该包含最简单的方法
if(isMode1) { //Code for mode1 } else { //Code for other modes }
尽pipe我认为正确的方法是使用PreProcessor指令
在我的代码中,我喜欢在main.cpp文件中执行此操作:
#define CRAZY_EXPERIMENT #ifdef TEST #include "Test.h" #elif ANOTHER_TEST #include "AnotherTest.h" #elif CRAZY_EXPERIMENT #include "CrazyExperiment.h" #else int main(int argc, int * argv[]){ runTheProgramLikeNormal(); } #endif
你看到的头文件都包含自己的main()
。 在程序中只有一个main()函数是基于在那里的第一个#define
定义的。 如果语句完全被省略,则默认为您所看到的规范main()函数。
这样可以很容易地为我的程序编写testing,只关注一个或两个组件。 最好的部分是testing头与我的代码整齐地隔离,所以没有testing代码被错误地留在(甚至链接)。
- 什么是replaceC中的string的函数?
- 使用Newtonsoft反序列化JSON到.NET对象(或LINQ到JSON也许?)
- ncurses是否可用于Windows?
- 如何初始化一个属于类成员的shared_ptr?
- 为什么IEnumerator <T>从IDisposableinheritance,而非genericsIEnumerator没有?
- 你能编译C#,所以在运行时不需要.NET Framework吗?
- 使用枚举内部types – 编译器警告C4482 C ++
- Facebook / Twitter与dotnetopenauth?
- 如何强制BundleCollection刷新MVC4中的caching脚本包