C Programming: Macro functions that return values
A few weeks ago I was searching around the Internet for an explanation of how to write a macro (preprocessor) function that returns a value.  All I could find was various articles suggesting something like this:
However, I was looking for a more complicated example for instance something with a loop like this:
All the articles I could find were suggesting adding an out parameter to the function to return the highest value. After a lot of searching around I eventually gave up and used inline functions instead. However, I recently stumbled upon an example of how this can be achieved without resorting to additional output parameters. It is actually quite simple as I expected. All you need to do is enclose the body in parentheses and braces and ensure the last statement evaluates to the required value. I thought I should share this just in case someone else is interested. Here is a complete example written in C:
Note: This example was tested with gcc.
#define MAX(A,B) ((A > B) ? A : B)
However, I was looking for a more complicated example for instance something with a loop like this:
#define MAX(A,B)  ((A > B) ? A : B)
#define HIGHEST(ARRAY) /* .... */
int main (void)
{
    int A[] = { 1, 2, 4, 3 };
    printf("%d\n", HIGHEST(A));
    return 0;
} All the articles I could find were suggesting adding an out parameter to the function to return the highest value. After a lot of searching around I eventually gave up and used inline functions instead. However, I recently stumbled upon an example of how this can be achieved without resorting to additional output parameters. It is actually quite simple as I expected. All you need to do is enclose the body in parentheses and braces and ensure the last statement evaluates to the required value. I thought I should share this just in case someone else is interested. Here is a complete example written in C:
#include <stdio.h>
#define MAX(A,B)  ((A > B) ? A : B)
#define HIGHEST(ARRAY) \
({ \
    int i; \
    typeof (ARRAY[0]) ret = ARRAY[0]; \
    for (i = 1; \
         i < (sizeof(ARRAY) / (sizeof(typeof (ret)))); \
         i++) \
    { \
        ret = MAX(ret, ARRAY[i]); \
    } \
    ret; \
})
int main (void)
{
    int A[] = { 1, 2, 4, 3 };
    printf("%d\n", HIGHEST(A));
}
The output of this application is: 4Note: This example was tested with gcc.
Comments