Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The role of #ifdef and #ifndef

#define one 0 #ifdef one printf("one is defined "); #ifndef one printf("one is not defined "); 

In this what is the role of #ifdef and #ifndef, and what's the output?

like image 654
alka pandey Avatar asked Sep 19 '10 05:09

alka pandey


People also ask

How do you use role in a sentence?

Examples of role in a SentenceHe plays the role of the villain. She was given the starring role. I had a minor role in the play. After her husband left her, she had to take on the dual role of mother and father for her children.

What is the meaning of role in something?

the position or purpose that someone or something has in a situation, organization, society, or relationship: What is his role in this project?

What does role of a person mean?

role, in sociology, the behaviour expected of an individual who occupies a given social position or status. A role is a comprehensive pattern of behaviour that is socially recognized, providing a means of identifying and placing an individual in a society.

What is a role example?

The definition of a role is a part or character someone performs or the function or position of a person. An example of a role is the character of the nurse in Romeo and Juliet. An example of a role is doing accounting for a business.


2 Answers

Text inside an ifdef/endif or ifndef/endif pair will be left in or removed by the pre-processor depending on the condition. ifdef means "if the following is defined" while ifndef means "if the following is not defined".

So:

#define one 0 #ifdef one     printf("one is defined "); #endif #ifndef one     printf("one is not defined "); #endif 

is equivalent to:

printf("one is defined "); 

since one is defined so the ifdef is true and the ifndef is false. It doesn't matter what it's defined as. A similar (better in my opinion) piece of code to that would be:

#define one 0 #ifdef one     printf("one is defined "); #else     printf("one is not defined "); #endif 

since that specifies the intent more clearly in this particular situation.

In your particular case, the text after the ifdef is not removed since one is defined. The text after the ifndef is removed for the same reason. There will need to be two closing endif lines at some point and the first will cause lines to start being included again, as follows:

     #define one 0 +--- #ifdef one |    printf("one is defined ");     // Everything in here is included. | +- #ifndef one | |  printf("one is not defined "); // Everything in here is excluded. | |  : | +- #endif |    :                              // Everything in here is included again. +--- #endif 
like image 168
paxdiablo Avatar answered Oct 11 '22 02:10

paxdiablo


Someone should mention that in the question there is a little trap. #ifdef will only check if the following symbol has been defined via #define or by command line, but its value (its substitution in fact) is irrelevant. You could even write

#define one 

precompilers accept that. But if you use #if it's another thing.

#define one 0 #if one     printf("one evaluates to a truth "); #endif #if !one     printf("one does not evaluate to truth "); #endif 

will give one does not evaluate to truth. The keyword defined allows to get the desired behaviour.

#if defined(one)  

is therefore equivalent to #ifdef

The advantage of the #if construct is to allow a better handling of code paths, try to do something like that with the old #ifdef/#ifndef pair.

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300 
like image 27
Patrick Schlüter Avatar answered Oct 11 '22 00:10

Patrick Schlüter