Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 268
  • Last Modified:

Converting a function into a macro.

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
Risky101
Asked:
Risky101
  • 2
1 Solution
 
Risky101Author Commented:
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
 
avizitCommented:
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
 
sunnycoderCommented:
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
 
Risky101Author Commented:
I've figured out a solution that satisfies the requirements in the original question. Thanks for your clues.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now