Peter Smit
Peter Smit

Reputation: 28716

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

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?

Upvotes: 24

Views: 17228

Answers (9)

James Curran
James Curran

Reputation: 103505

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.

Upvotes: 30

lsk
lsk

Reputation: 532

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 :-)

Upvotes: 2

oboewan42
oboewan42

Reputation: 88

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.)

Upvotes: 2

user313885
user313885

Reputation:

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).

Upvotes: 3

P Shved
P Shved

Reputation: 99264

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.

Upvotes: 9

Robert Deml
Robert Deml

Reputation: 12532

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.

Upvotes: 5

mythz
mythz

Reputation: 143319

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.

Upvotes: 1

kennytm
kennytm

Reputation: 523294

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

Upvotes: 18

fortran
fortran

Reputation: 76057

For experimenting with various code paths.

Upvotes: 4

Related Questions