Skip to main content

Simple program to illustrate variadic macros In C

/*
 * C99 has  support of variable arguments in macros statement
 * (called variadic macro) just like variable argument function, Macros also 
 * can be of variable number of augments
 * This program illustrate variadic macros
 */

#include <stdio.h>
  /*
  * Simple Macro definition
  * which allows to print whatever the way you want
  *  in Macro definition "..." indicates variadic macro, OP() definition is 
  * mixture of named args and variable number of aguments, it is possible
  * to have macro of complete variable number of args
  * like DISPLAY in below example
  */

#define OP(format, exp, ...)  printf(format, exp, ##__VA_ARGS__)
#define DISPLAY(...)    printf(__VA_ARGS__)
int main()
{
 int a=3, b=4, c=5;

 OP("%s %d\n", "Result after add", a+b);
 OP("%s %d %s %d\n", "Result after add", a+b+c, "Result after sub", a-b);
 OP("%s\n", "This is test program");
 OP("%s %f\n", "Division of a/b", a/(double)b);
 OP("%s %s %s %s\n", "This", "is", "Variadic", "Macro");

 /* This show why we used ## token paste operator at macro definition, 
  * our definition indicates  2 mandatory args and variable number of args, 
  * if we left out variable argument in macro statement(in case if we have only
  * mandatory args) program will not compile, as in below statement, such  
  * cases ## will come to resuce, ## operator has a special meaning
  * when placed  between a comma and a variable argument, in case if we
  * don't have variable argument, ## will delete the comma (,) between
  * last mandatory argument and __VA_ARGS__
  */
 OP("%s\n", "Only two args"); 

 DISPLAY("%s %s\n", "Variadic", "Macro only");

 return 0;
}



Comments

Popular posts from this blog

C Program to Simulate Linux Cat command

/*  * C program to Simulate Implementation of  Linux *cat* command  * This program will not handle redirection  * you can try to improve this program to handle redirection of file contents  */ #include<stdio.h> #include<string.h> #define MAX_FILE_NAME_CHARS 255 int main(int argc, char *argv[]) {  FILE *fp;  char file_name[MAX_FILE_NAME_CHARS], ch;  int i;  /*   * after creating a.out, rename it as mycat for our own cat command   * and it usage is same as standard cat command   */  if(argc<1){     printf("Usage mycat <filename> \n");     return 0;  }  /*   * cat handles more than one file   * so we need this loop to handle all the files provided   * on command line   */  for(i=1; i<=argc;i++){     /* no need of copy but for understanding purpose, i have created      * str...

simple program to create Orphan process

shiv@ubuntu:~/ds/unix$ cat  orp.c /*  * Program to create orphan process @ Linux  * getpid() gives process PID and   * getppid() gives process's parent ID   * here main() process ID is parent id is current shells PID  * once process becomes orphan it is adopted by init process(it's PID is 1)  */   #include<stdio.h> #include<unistd.h> int main() {  pid_t p; /* create child process */  p=fork();  if(p==0) {     /* fork() returns Zero to child */     sleep(10);  }  printf("The child process pid is %d parent pid %d\n", getpid(), getppid()); /*parent/child waits for 20 secs and exits*/  sleep(20);  printf("\nProcess %d is done its Parent pid %d...\n", getpid(), getppid());  return 0; } O/p shiv@ubuntu:~/ds/unix$ ./a.out The child process pid is 2575 parent pid 1922 The child process pid is 2576 parent pid 2575 Process 2575 is done it...

C Program to find Armstrong numbers between range m and n

/*  * Program to print Armstrong number between range m and n  * Armstrong  number is nothing but sum of cubes of digits of number is  * equal to the number  * ex: 153 is Armstrong number since 1^3+5^3+3^3=153  * there are very few numbers hold above property; execute   * below program to find all numbers  * b/w m and n  */ #include <stdio.h> void is_armstrong(int num) {   int sum=0, n, d;   n=num;   while(n){   d=n%10;  /* extract digits of number*/   sum=sum+(d*d*d);  /*take sum of them */   n=n/10;  }  if(sum == num)  /*sum is same as number then it is Armstrong number*/     printf("%d\n", sum); } int main() { int i,n,m; printf("Enter range \n"); scanf("%d%d", &m, &n);  for(i=m;i<=n;i++){    is_armstrong(i);  } return 0; }