Thread: Passing hr function name, line of a parent function ussing macros

  1. #1
    Registered User
    Join Date
    Jul 2018
    Posts
    6

    Passing hr function name, line of a parent function ussing macros

    How can pass the funtion name __func__ and __LINE__ of the parent function using macros, for handling error processes

    I have a in the main.c a call to a function for printing an array
    Code:
    #include "print.h"
    int main()
    {
        int8_t numeros[] = {23,45,78,23};
        PrintArray(numeros,NumberOfArrayElements(numeros),INT8);
        return EXIT_SUCCESS;
    }
    in Print.c
    Code:
    #include "print.h"
    
    void PrintArray(void *array, int64_t sizeArray, uint8_t typeData)
    {
        if(sizeArray <= 0)
        {
            ErrorRaise(errorSizePrint, __func__,__LINE__);
        }
    
        if(CHAR == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%c", *((char*)array + i));
            }
            printf("\n");
        }
        else if(UNSIGNED_CHAR == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%c", *((unsigned char*)array + i));
            }
            printf("\n");
        }
        else if(INT8  == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%d ", *((int8_t*)array +i) );
            }
            printf("\n");
        }
        else if(UNSIGNED_INT8 == typeData)
        {
            uint8_t* auxiliarPointer = (uint8_t*)array;
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%u ", auxiliarPointer[i]);
            }
            printf("\n");
        }
        else if(INT16 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%d ", *((int16_t*)array + i));
            }
            printf("\n");
        }
        else if(UNSIGNED_INT16 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%u ", *((uint16_t*)array + i));
            }
            printf("\n");
        }
        else if(INT32 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%d ", *((int32_t*)array + i));
            }
            printf("\n");
        }
        else if(UNSIGNED_INT32 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%u ", *((uint32_t*)array + i));
            }
            printf("\n");
        }
        else if(INT64 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                #ifdef __unix__
                printf("%ld ", *((int64_t*)array + i));
                #else //windows
                printf("%I64d ", *((int64_t*)array + i));
                #endif
            }
            printf("\n");
        }
        else if(UNSIGNED_INT64 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                #ifdef __unix__
                printf("%ld ", *((uint64_t*)array + i));
                #else //Windows
                printf("%I64d ", *((uint64_t*)array + i));
                #endif
            }
            printf("\n");
        }
        else if(FLOAT == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%f ", *((float*)array + i));
            }
            printf("\n");
        }
        else if(DOUBLE == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%f ", *((double*)array + i));
            }
            printf("\n");
        }
        else
        {
            ErrorRaise(errorTypePrint, __func__,__LINE__);
        }
    }
    Look at his part if the array size is <= 0 then a function error is called, but i would like to pass the function and line of the parent function in main, but with out modifying the looking syntax of
    Code:
    PrintArray(numeros,NumberOfArrayElements(numeros),INT8);
    using a MAcro definfition like:
    Code:
    void _trace(char const *function, char const *file, long line, char const *message) {
      printf("%s[%s:%ld], %s\n", function, file, line, message);
    }
    
    #define trace(message) _trace(__FUNCTION__, __FILE__, __LINE__, (message))
    in print.h

    Code:
    #ifndef PRINT_H_INCLUDED
    #define PRINT_H_INCLUDED
    
    #include <stdio.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include "header.h"
    #include "error.h"
    
    void PrintArray(void *array, int64_t sizeArray, uint8_t typeData);
    
    
    #endif // PRINT_H_INCLUDED

    I tried to implement this but i have not been successful, please could you help me to achieve this.

  2. #2
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,661
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

  3. #3
    Registered User
    Join Date
    Jul 2018
    Posts
    6
    Thanks for the help, but i was more searching this soultion

    main.c
    Code:
    #include "print.h"
    int main()
    {
        int8_t numeros[] = {23,45,78,23};
        PrintArray(numeros,NumberOfArrayElements(numeros),INT8);
        return EXIT_SUCCESS;
    }
    print.c
    Code:
    #include "print.h"
    
    void _PrintArray(void *array, int64_t sizeArray, uint8_t typeData, char const *fileName, char const *functionName, const int64_t lineNumber)
    {
        if(sizeArray <= 0)
        {
            ErrorRaise(errorSizePrint, fileName, functionName, lineNumber);
        }
    
        if(CHAR == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%c", *((char*)array + i));
            }
            printf("\n");
        }
        else if(UNSIGNED_CHAR == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%c", *((unsigned char*)array + i));
            }
            printf("\n");
        }
        else if(INT8  == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%d ", *((int8_t*)array +i) );
            }
            printf("\n");
        }
        else if(UNSIGNED_INT8 == typeData)
        {
            uint8_t* auxiliarPointer = (uint8_t*)array;
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%u ", auxiliarPointer[i]);
            }
            printf("\n");
        }
        else if(INT16 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%d ", *((int16_t*)array + i));
            }
            printf("\n");
        }
        else if(UNSIGNED_INT16 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%u ", *((uint16_t*)array + i));
            }
            printf("\n");
        }
        else if(INT32 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%d ", *((int32_t*)array + i));
            }
            printf("\n");
        }
        else if(UNSIGNED_INT32 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%u ", *((uint32_t*)array + i));
            }
            printf("\n");
        }
        else if(INT64 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                #ifdef __unix__
                printf("%ld ", *((int64_t*)array + i));
                #else //windows
                printf("%I64d ", *((int64_t*)array + i));
                #endif
            }
            printf("\n");
        }
        else if(UNSIGNED_INT64 == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                #ifdef __unix__
                printf("%ld ", *((uint64_t*)array + i));
                #else //Windows
                printf("%I64d ", *((uint64_t*)array + i));
                #endif
            }
            printf("\n");
        }
        else if(FLOAT == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%f ", *((float*)array + i));
            }
            printf("\n");
        }
        else if(DOUBLE == typeData)
        {
            for(uint64_t i = 0; i < (uint64_t)sizeArray; i++)
            {
                printf("%f ", *((double*)array + i));
            }
            printf("\n");
        }
        else
        {
            ErrorRaise(errorSizePrint, fileName, functionName, lineNumber);
        }
    }
    print.h
    Code:
    #ifndef PRINT_H_INCLUDED
    #define PRINT_H_INCLUDED
    
    #include <stdio.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include "header.h"
    #include "error.h"
    
    #define PrintArray(array, sizeArray, typeData) _PrintArray(array, sizeArray, typeData, __FILE__, __FUNCTION__, __LINE__)
    
    void _PrintArray(void *array, int64_t sizeArray, uint8_t typeData, char const *fileName, char const *functionName, const int64_t lineNumber);
    #endif // PRINT_H_INCLUDED
    So this define does all the work
    Code:
    #define PrintArray(array, sizeArray, typeData) _PrintArray(array, sizeArray, typeData, __FILE__, __FUNCTION__, __LINE__)
    In main.c i can still call the PrintArray() without given the file, function and line parameters, so when an event of handling error occuors due to the parameters in main.c the error function will return the file, func and line of the main.c where the errors has happened. The programmer who use this function will have a littel handling error rutine inside without notice it.

    Example


    changed INT8 definition to a number out of range like 50 for example

    main.c
    Code:
    #include "print.h"
    #include "array.h"
    #include "allocator.h"
    #include "sort.h"
    #include "aritmethic.h"
    
    int main()
    {
        int8_t numeros[] = {23,45,78,23};
        PrintArray(numeros,NumberOfArrayElements(numeros),50);
        return EXIT_SUCCESS;
    }
    output
    Passing hr function name, line of a parent function ussing macros-error-png
    Last edited by aurquiel; 10-02-2018 at 09:58 AM.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. macros: can i test if a function was defined?
    By joaquim in forum C++ Programming
    Replies: 3
    Last Post: 05-01-2018, 03:14 PM
  2. Replies: 12
    Last Post: 12-30-2015, 12:50 AM
  3. Using switch statements in function-like macros
    By robot_chicken in forum C Programming
    Replies: 3
    Last Post: 07-25-2009, 03:09 PM
  4. function definition with macros
    By toshog in forum C++ Programming
    Replies: 2
    Last Post: 03-08-2009, 09:22 PM
  5. Replies: 14
    Last Post: 06-16-2007, 10:17 AM

Tags for this Thread