February 25, 2016

Functions with variable number of arguments

    1. Functions can be written to handle variable number of arguments. For example, printf().

    2. The function prototype should have atleast one known argument followed by ellipsis (set of 3 dots)     which represent any unknown number of arguments passed. The ellispsis should only appear as the last aruments.

 void function(char var1, int var2, ...);

    3. This feature is implemented using a set of macros va_list, va_start, va_arg, va_end, va_copy defined in stdarg.h. All the above macros were defined since C89 except va_copy which is defined since C99.

    4. va_list is a type used to declare a pointer to be used by other macros.

 va_list ap;

    5. va_start is a macro which initializes ap to point to the first anonymous argument (unknown argument) which is stored in stack memory. The known argument just before the ellipsis is used by va_start as a reference in the memory to locate the unknown arguments. va_start should be invoked before va_arg.

 va_start(ap, var2);

    6. va_arg is a macro which retuns an unknown argument on every call and steps ap to the next argument. var_arg uses type name as its second parameter to determine the return type and step size.

 temp = va_arg(ap, );

        The used can be one of the fully promoted types (int, unsigned int, double), its pointer types and void *. The behaviour of va_arg is undefined if the is not compatible with the actual type if there is no next argument.

    7. va_copy is a macro that creates a copy of ap such that the current state of ap is copied.

 va_copy(ap, ap_copy);

    8. va_end clears the ap so that is no more usable. It must be called before returning from the function.

 va_end(ap);

Example:

#include <stdio.h>
#include <stdarg.h>

int add(int c, ...);

int main()
{
    int res1, res2, res3, res4;

    res1 = add(3, 1, 2, 3);

    res2 = add(5, 1, 2, 3, 4, 5);

    res3 = add(7, 1, 2, 3, 4, 5, 6, 7);

    res4 = add(9, 1, 2, 3, 4, 5, 6, 7, 8, 9);

    printf("res1 = %d\nres2 = %d\nres3 = %d\nres4 = %d\n",
    res1, res2, res3, res4);
}


int add(int count, ...)
{
    int sum = 0, sum2 = 0;
    va_list valist, valist2;
    
    va_start(valist, count);

    while (count) {
 if (count == 2)
     va_copy(valist2, valist);

 sum += va_arg(valist, int *);

 if (count &lt;=2)
     sum2 += va_arg(valist2, int);
 --count;
    }

    return sum;
}

 Reference:

    1. K&amp;R - Sec 7.3, Appendix B7
    2. c99 - Sec 4.8

Disclaimer:
The above article doesn't give you any guarantee and the sole purpose of this article is to share my learning in the way I understood. Any comments to refine this article are welcome with great pleasure. Please report any breaking link by commenting below.

No comments:

Post a Comment

Comment will be published after moderation only. Do not advertise here.

Receive all updates via Facebook. Just Click the Like Button Below

You can also receive Free Email Updates:

dgpride - Study Zone - Free Books - Tamil Lyrics

Copyright © 2008 -2012 dgpride. All rights reserved.

Subject/Topics

2 Marks (26) 8051 (1) AC Machines (7) Animations (1) Anna University Chennai (31) Arduino (4) ARM (3) Audio (1) Basic C Concepts (8) Basic Electronics (13) Basic principles (9) Book list (1) CAD (1) Chemical (2) Circuit theory (6) Civil (2) Cloud Computing (1) Communication (4) Competitive exams (2) Computer Architecture (4) Control system and components (9) CSE (40) Curriculum (4) DC Machines (9) Did you know (14) Digital (13) DLC (4) Documentation (1) DSP (1) EC 2201 (3) ECE (45) EDC (1) EEE (34) EIE (63) Electrical (35) Electronics (43) Electroplating (2) Emacs (1) Embedded basics (19) Embedded C Programming (19) Embedded Linux (5) Embedded System (22) Engineering basics (15) Environmental Science (1) Fibre Optics (1) Filters (2) FPGA (1) GATE (3) General (7) GNU (4) Handwritten (1) Hobbyist (15) How to (8) HTML (3) Humanities (2) IC Engines (7) ICE (5) Industrial Electronics (10) Industrial Instrumentatin (2) industrial process (2) Instrumentation (21) IoT (2) IT (2) Laboratory Manuals (17) LabVIEW (2) Lesson notes (2) LIC (2) Links (9) Linux (8) Magnetics (1) Management (1) Mechanical (5) Mechatronics (9) Microcontrollers (14) Microprocessors (9) Microsoft (1) Motivation (1) Must Know (11) Networks (1) NuttX (1) Objective type (1) Open Source (1) Opportunities (7) Oscillators (2) Part Time (1) Physics (1) Post Graduation (1) Power Electronics (12) Power Plant Engineering (2) Power Supplies (2) Previous GATE Papers (1) Process Control (2) Project (4) Protocol (1) R2008 (11) R2009 (1) R2013 (1) Recruitment (2) Research (2) Robotics (9) RTOS (3) Signal Processing (8) Signals and Systems (4) SMPS (1) Software tutorial (4) Stepper Motor (2) Syllabus (5) Texas Instruments (2) Thermodynamics (2) Training and Placement (6) Transducer Engineering (2) Transformer (2) Transmission (1) Tutorials (48) Two Marks (26) U-Boot (1) University Question Papers (16) Verilog (1) Video (4) Virtual Instrumentation (3) Visual Basic (21) VLSI (11) Web designing (4) Wi-Fi (3) Wireless (6)