Why would somebody use an #if 1 C preprocessor directive?

試著忘記壹切 提交于 2019-12-17 19:32:58

问题


I am looking through some C source code and I don't understand the following part

#if 1

   typedef unsigned short PronId;
   typedef unsigned short LMId;
#  define LM_NGRAM_INT

#else

   typedef unsigned int LMId;
   typedef unsigned int PronId;
#  undef LM_NGRAM_INT

#endif

Why would someone do #if 1? Isn't it true that only the first block will ever be processed?


回答1:


Yes.. Only the first block will be processed --- until someone changes the 1 to a 0. Then the other block will be compiled. This is a convenient way to temporary switch blocks of code in and out while testing different algorithms.




回答2:


So that one can quickly choose which part to compile by changing the #if 1 to #if 0.




回答3:


One of the fundamental properties of software is that computer program is cheap to modify.

That's why certain code is written in such a way that it will make modification easier. That's why they need various patterns, like "interface", or "proxy".

And that's why you sometimes see weird constructs like #if 1-#else-#endif, an only purpose of which is to easily switch the part of code that will be compiled, by small effort: changing 1 to 0.




回答4:


I put that in my code when I need to test different set of parameters. Usually my product will ship with different defaults than what I can work with in a debug environment, so I put the shipping defaults in a #if 1 and the debug defaults in the #else with a #warning to warn me it's being built with debug defaults.




回答5:


For experimenting with various code paths.




回答6:


It is just a different way to comment out big piece of code, so, editor auto indentation would not break indentation (commented block of code would be indented as text, not as code).




回答7:


I'm actually using it as a kludge to make code folding easier; if I wrap a section of code in an #if 1 ... #endif, I can fold it in my editor. (The code in question is very macro-heavy, and not written by me, so more traditional ways of making a huge block of code manageable won't work.)




回答8:


It's another way of saying for #if true it was most likely a result of code that was previously checking for another symbol then refactored to always be true.




回答9:


The cleaner way of doing it is probably doing something like:

#if ALGO1

#else

#endif

But, you will have to pass in ALGO1 to the compiler args somewhere...for example in a makefile, you need to add -DALGO1=1 (if no 1 is provided, 1 is assumed). Ref: http://www.amath.unc.edu/sysadmin/DOC4.0/c-compiler/user_guide/cc_options.doc.html

This is more work...so, usually, for quick checks, #if 1 is used. And in some cases, forgotten and left behind as well :-)



来源:https://stackoverflow.com/questions/2266060/why-would-somebody-use-an-if-1-c-preprocessor-directive

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!