Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are the applications of the ## preprocessor operator and gotchas to consider?

As mentioned in many of my previous questions, I'm working through K&R, and am currently into the preprocessor. One of the more interesting things — something I never knew before from any of my prior attempts to learn C — is the ## preprocessor operator. According to K&R:

The preprocessor operator ## provides a way to concatenate actual arguments during macro expansion. If a parameter in the replacement text is adjacent to a ##, the parameter is replaced by the actual argument, the ## and surrounding white space are removed, and the result is re-scanned. For example, the macro paste concatenates its two arguments:

#define paste(front, back) front ## back

so paste(name, 1) creates the token name1.

How and why would someone use this in the real world? What are practical examples of its use, and are there gotchas to consider?

like image 847
John Rudy Avatar asked Oct 19 '08 19:10

John Rudy


People also ask

What are the applications of computer explain?

Computers are used at homes for several purposes like online bill payment, watching movies or shows at home, home tutoring, social media access, playing games, internet access, etc. They provide communication through electronic mail. They help to avail work from home facility for corporate employees.


1 Answers

One thing to be aware of when you're using the token-paste ('##') or stringizing ('#') preprocessing operators is that you have to use an extra level of indirection for them to work properly in all cases.

If you don't do this and the items passed to the token-pasting operator are macros themselves, you'll get results that are probably not what you want:

#include <stdio.h>  #define STRINGIFY2( x) #x #define STRINGIFY(x) STRINGIFY2(x) #define PASTE2( a, b) a##b #define PASTE( a, b) PASTE2( a, b)  #define BAD_PASTE(x,y) x##y #define BAD_STRINGIFY(x) #x  #define SOME_MACRO function_name  int main()  {     printf( "buggy results:\n");     printf( "%s\n", STRINGIFY( BAD_PASTE( SOME_MACRO, __LINE__)));     printf( "%s\n", BAD_STRINGIFY( BAD_PASTE( SOME_MACRO, __LINE__)));     printf( "%s\n", BAD_STRINGIFY( PASTE( SOME_MACRO, __LINE__)));      printf( "\n" "desired result:\n");     printf( "%s\n", STRINGIFY( PASTE( SOME_MACRO, __LINE__))); } 

The output:

buggy results: SOME_MACRO__LINE__ BAD_PASTE( SOME_MACRO, __LINE__) PASTE( SOME_MACRO, __LINE__)  desired result: function_name21 
like image 115
Michael Burr Avatar answered Oct 02 '22 17:10

Michael Burr