Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Converting a function into a macro.

Posted on 2004-08-03
4
Medium Priority
?
260 Views
Last Modified: 2010-04-22
I wish to convert the following function into a macro:

#define VERBOSE_LEVEL 5
int my_printk(int verbosity,char *buffer)
{
  if ((verbosity > VERBOSE_LEVEL) {
    printk("%s",buffer);
  }
  return 0;
}

my_printk(1,"debugging message"); // does not get printed due to verbosity level
my_printk(6,"normal message"); // does get printed

Furthermore, I wish to have one additional feature: when a message is to be excluded due to VERBOSE_LEVEL being set too low, the macro must exclude the string from the driver binary, to save space and time. It must not do any calculations at run time.


0
Comment
Question by:Risky101
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
4 Comments
 

Author Comment

by:Risky101
ID: 11707696
I tried the following, not expecting it to work:

#define test(verbosity,y) \
#if verbosity>5 \
printk("verbose %s",y); \
#else \
//printk("alternate %s",y); \
#endif;

Of course, ths violates ANSI C - any other idaes?
0
 
LVL 11

Expert Comment

by:avizit
ID: 11711745
http://tinyurl.com/3majq   might help. There is one implementation which I am pasting here.



File debug.h:

#ifndef DEBUG_H
#define DEBUG_H
#include <stdarg.h>

#if defined(NDEBUG) && defined(__GNUC__)
/* gcc's cpp has extensions; it allows for macros with a variable number of
   arguments. We use this extension here to preprocess pmesg away. */
#define pmesg(level, format, args...) ((void)0)
#else
void pmesg(int level, char *format, ...);
/* print a message, if it is considered significant enough.
      Adapted from [K&R2], p. 174 */
#endif

#endif /* DEBUG_H */
       

File debug.c:

#include "debug.h"
#include <stdio.h>

extern int msglevel; /* the higher, the more messages... */

#if defined(NDEBUG) && defined(__GNUC__)
/* Nothing. pmesg has been "defined away" in debug.h already. */
#else
void pmesg(int level, char* format, ...) {
#ifdef NDEBUG
      /* Empty body, so a good compiler will optimise calls
         to pmesg away */
#else
        va_list args;

        if (level>msglevel)
                return;

        va_start(args, format);
        vfprintf(stderr, format, args);
        va_end(args);
#endif /* NDEBUG */
#endif /* NDEBUG && __GNUC__ */
}
       
0
 
LVL 45

Accepted Solution

by:
sunnycoder earned 750 total points
ID: 11712402
exact replication of functionality is not possible since you cannot return values from a macro and there is no type checking in a macro so it will manipulate whatever argument it gets.

>Furthermore, I wish to have one additional feature: when a message is to be excluded due to VERBOSE_LEVEL being set too
>low, the macro must exclude the string from the driver binary, to save space and time. It must not do any calculations at run
>time.
this involved conditional compilations and would be #ifdefs .. you can embed the call to my_printk in the ifdef and then you can even do away with my_printk since you have already checked verbosity level before the call, you dont need to check it again and all that leaves in the function is a printk

#ifdef MY_LEVEL
printk (...blah..)
#endif

should serve the same purpose
0
 

Author Comment

by:Risky101
ID: 11719974
I've figured out a solution that satisfies the requirements in the original question. Thanks for your clues.
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The purpose of this article is to fix the unknown display problem in Linux Mint operating system. After installing the OS if you see Display monitor is not recognized then we can install "MESA" utilities to fix this problem or we can install additio…
The purpose of this article is to demonstrate how we can upgrade Python from version 2.7.6 to Python 2.7.10 on the Linux Mint operating system. I am using an Oracle Virtual Box where I have installed Linux Mint operating system version 17.2. Once yo…
This tutorial will teach you the special effect of super speed similar to the fictional character Wally West aka "The Flash" After Shake : http://www.videocopilot.net/presets/after_shake/ All lightning effects with instructions : http://www.mediaf…
Have you created a query with information for a calendar? ... and then, abra-cadabra, the calendar is done?! I am going to show you how to make that happen. Visualize your data!  ... really see it To use the code to create a calendar from a q…
Suggested Courses

670 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question