Defining a list of macro parameters.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Paul

    Defining a list of macro parameters.

    I would like to define a list of parameters, and then pass them to a macro.
    However, the compiler (gcc) only sees one parameter, rather than expanding
    the definition.
    Could anyone suggest a way of making this work (using the preprocessor)?

    #define MyList 1,2,3,4

    #define Sum(a,b,c,d) a+b+c+d

    x = Sum(MyList);

    (n.b. i can pass 'MyList' to a function, but i'd rather pass it to a macro).


  • Harald van =?UTF-8?b?RMSzaw==?=

    #2
    Re: Defining a list of macro parameters.

    On Wed, 30 Apr 2008 08:44:57 +0100, Paul wrote:
    I would like to define a list of parameters, and then pass them to a
    macro. However, the compiler (gcc) only sees one parameter, rather than
    expanding the definition.
    That's the correct behaviour. The list of macro arguments is first split,
    and then expanded. Otherwise, what would you expect

    #define MACRO(foo, ...) #foo foo
    #define LIST 1,2,3
    MACRO(LIST, 4)

    to expand to? #foo doesn't expand the parameter, so it can only be
    "LIST", but foo by itself would only be 1?
    Could anyone suggest a way of making this work (using the preprocessor)?
    >
    #define MyList 1,2,3,4
    >
    #define Sum(a,b,c,d) a+b+c+d
    >
    x = Sum(MyList);
    #define Invoke(Macro, Args) Macro Args
    Invoke(Sum, (MyList))

    Comment

    • Peter Nilsson

      #3
      Re: Defining a list of macro parameters.

      Paul wrote:
      ...Could anyone suggest a way of making this work (using
      the preprocessor)?
      >
      #define MyList 1,2,3,4
      >
      #define Sum(a,b,c,d) a+b+c+d
      >
      x = Sum(MyList);
      >
      (n.b. i can pass 'MyList' to a function, but i'd rather pass it to a macro).
      #include <stdio.h>

      #define MyList 1, 2, 3, 4
      #define Sum(a,b,c,d) ((a) + (b) + (c) + (d))

      #define SUM(LIST) Sum(LIST)

      int main(void)
      {
      printf("%d\n", SUM(MyList));
      return 0;
      }

      --
      Peter

      Comment

      • user923005

        #4
        Re: Defining a list of macro parameters.

        On Apr 30, 4:11 pm, Peter Nilsson <ai...@acay.com .auwrote:
        Paul wrote:
        ...Could anyone suggest a way of making this work (using
        the preprocessor)?
        >
        #define MyList  1,2,3,4
        >
        #define Sum(a,b,c,d) a+b+c+d
        >
         x = Sum(MyList);
        >
        (n.b. i can pass 'MyList' to a function, but i'd rather pass it to a macro).
        >
          #include <stdio.h>
        >
          #define MyList 1, 2, 3, 4
          #define Sum(a,b,c,d) ((a) + (b) + (c) + (d))
        >
          #define SUM(LIST) Sum(LIST)
        >
          int main(void)
          {
            printf("%d\n", SUM(MyList));
            return 0;
          }
        >

        C:\tmp>cl /W4 /Ox oopsie.c
        Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762
        for 80x86
        Copyright (C) Microsoft Corporation. All rights reserved.

        oopsie.c
        oopsie.c(12) : warning C4003: not enough actual parameters for macro
        'Sum'
        oopsie.c(12) : error C2059: syntax error : ')'

        C:\tmp>type oopsie.c
        #include <stdio.h>

        #define MyList 1, 2, 3, 4
        #define Sum(a,b,c,d) ((a) + (b) + (c) + (d))


        #define SUM(LIST) Sum(LIST)


        int main(void)
        {
        printf("%d\n", SUM(MyList));
        return 0;
        }

        My effort:
        #include <stdio.h>
        int main(void) {puts("10");ret urn 0;}

        It might be possible to accomplish the OP's task, but this one is even
        worse than the sizeof without sizeof as far as brain dead requests go.
        Someone needs to get "The C Puzzle Book" of the professor's desk and
        give him a real textbook.
        IMO-YMMV

        P.S.
        Let's head this one off at the pass:

        6.11: I came across some "joke" code containing the "expression "
        5["abcdef"] . How can this be legal C?

        A: Yes, Virginia, array subscripting is commutative in C. This
        curious fact follows from the pointer definition of array
        subscripting, namely that a[e] is identical to *((a)+(e)), for
        *any* two expressions a and e, as long as one of them is a
        pointer expression and one is integral. This unsuspected
        commutativity is often mentioned in C texts as if it were
        something to be proud of, but it finds no useful application
        outside of the Obfuscated C Contest (see question 20.36).

        References: Rationale Sec. 3.3.2.1; H&S Sec. 5.4.1 p. 124,
        Sec. 7.4.1 pp. 186-7.

        Comment

        • Paul

          #5
          Re: Defining a list of macro parameters.

          Harald and Peter: Thank you for your solutions, cheers!

          "user923005 " <dcorbit@connx. comwrote...
          >My effort:
          >#include <stdio.h>
          >int main(void) {puts("10");ret urn 0;}
          >It might be possible to accomplish the OP's task, but this one is even
          >worse than the sizeof without sizeof as far as brain dead requests go.
          >Someone needs to get "The C Puzzle Book" of the professor's desk and
          >give him a real textbook.
          IMO-YMMV

          user, thankyou for your contribution, however the line puts("10") does not
          work properly for my intended application (which i simplified for posting):

          #define GreenLed ( GPIOB, 10, OutputOpenDrain , InvertedOut)
          #define InvertedOut &=~,|=
          #define Port(Function, Name) Function Name
          #define TurnOn(Port,Pin ,Type,On,Off) Port->ODR On Bit(Pin)
          Port(TurnOn,Gre enLed);



          Comment

          • user923005

            #6
            Re: Defining a list of macro parameters.

            On May 1, 2:23 am, "Paul" <-wrote:
            Harald and Peter: Thank you for your solutions, cheers!
            >
            "user923005 " <dcor...@connx. comwrote...
            My effort:
            #include <stdio.h>
            int main(void) {puts("10");ret urn 0;}
            It might be possible to accomplish the OP's task, but this one is even
            worse than the sizeof without sizeof as far as brain dead requests go.
            Someone needs to get "The C Puzzle Book" of the professor's desk and
            give him a real textbook.
            >
            IMO-YMMV
            >
            user, thankyou for your contribution, however the line puts("10") does not
            work properly for my intended application (which i simplified for posting):
            >
            #define GreenLed ( GPIOB, 10, OutputOpenDrain , InvertedOut)
            #define InvertedOut &=~,|=
            #define Port(Function, Name) Function Name
            #define TurnOn(Port,Pin ,Type,On,Off) Port->ODR On Bit(Pin)
            Port(TurnOn,Gre enLed);
            Don't use macros. Use functions.

            Comment

            • Peter Nilsson

              #7
              Re: Defining a list of macro parameters.

              user923005 wrote:
              Peter Nilsson <ai...@acay.com .auwrote:
              #include <stdio.h>

              #define MyList 1, 2, 3, 4
              #define Sum(a,b,c,d) ((a) + (b) + (c) + (d))

              #define SUM(LIST) Sum(LIST)

              int main(void)
              {
              printf("%d\n", SUM(MyList));
              return 0;
              }
              >
              C:\tmp>cl /W4 /Ox oopsie.c
              Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762
              for 80x86
              Copyright (C) Microsoft Corporation. All rights reserved.
              >
              oopsie.c
              oopsie.c(12) : warning C4003: not enough actual parameters for macro
              'Sum'
              oopsie.c(12) : error C2059: syntax error : ')'
              Don't let me stop you filing a bug report with Microsoft.

              --
              Peter

              Comment

              • CBFalconer

                #8
                Re: Defining a list of macro parameters.

                Paul wrote:
                >
                .... snip ....
                >
                user, thankyou for your contribution, however the line puts("10")
                does not work properly for my intended application (which i
                simplified for posting):
                Did you #include <stdio.h>?

                --
                [mail]: Chuck F (cbfalconer at maineline dot net)
                [page]: <http://cbfalconer.home .att.net>
                Try the download section.


                ** Posted from http://www.teranews.com **

                Comment

                Working...