Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. Design and Architecture
  4. To MACRO or not to MACRO

To MACRO or not to MACRO

Scheduled Pinned Locked Moved Design and Architecture
questionc++csscomtools
10 Posts 9 Posters 7 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    BadKarma
    wrote on last edited by
    #1

    In the C++ community there is certain unhappy feeling towards the use of MACROs. In a post someone was given the advice to use a inline function instead of a MACRO. This is certainly good advice. Now my question is the following: Are there any reasons/issues or other situations where a MACRO can be preferred over another solution. Or should one 'try' to find a better C++ approach. One thing could be to decrease the amount of code, so it becomes more readable and less complex. Any thoughts on this?

    codito ergo sum

    R E S A S 6 Replies Last reply
    0
    • B BadKarma

      In the C++ community there is certain unhappy feeling towards the use of MACROs. In a post someone was given the advice to use a inline function instead of a MACRO. This is certainly good advice. Now my question is the following: Are there any reasons/issues or other situations where a MACRO can be preferred over another solution. Or should one 'try' to find a better C++ approach. One thing could be to decrease the amount of code, so it becomes more readable and less complex. Any thoughts on this?

      codito ergo sum

      R Offline
      R Offline
      Rob Graham
      wrote on last edited by
      #2

      BadKarma wrote:

      One thing could be to decrease the amount of code, so it becomes more readable and less complex.

      No, that is hiding complexity, not decreasing it. MACROS are a bad substitute for redesigning bad, unnecessarily complex code. They also make debugging more difficult. I can't think of any situation where a MACRO would be the preferred solution.

      P CPalliniC A 3 Replies Last reply
      0
      • R Rob Graham

        BadKarma wrote:

        One thing could be to decrease the amount of code, so it becomes more readable and less complex.

        No, that is hiding complexity, not decreasing it. MACROS are a bad substitute for redesigning bad, unnecessarily complex code. They also make debugging more difficult. I can't think of any situation where a MACRO would be the preferred solution.

        P Offline
        P Offline
        Pete OHanlon
        wrote on last edited by
        #3

        The only time that it's acceptable is if you are deliberately attempting to create bad code where you are the only person who can maintain it. Hmmm - oh wait - that's the sign of a really bad app.

        Deja View - the feeling that you've seen this post before.

        1 Reply Last reply
        0
        • R Rob Graham

          BadKarma wrote:

          One thing could be to decrease the amount of code, so it becomes more readable and less complex.

          No, that is hiding complexity, not decreasing it. MACROS are a bad substitute for redesigning bad, unnecessarily complex code. They also make debugging more difficult. I can't think of any situation where a MACRO would be the preferred solution.

          CPalliniC Offline
          CPalliniC Offline
          CPallini
          wrote on last edited by
          #4

          Actually MACROs are widely used in the ATL library, that is no such bad design example. MACROs are also used in MFC, and, for instance, to make more readable operations on ListView, ecc..., DirectX often hides COM complexity using macros. MACROs are hazardous of course and there are arguments against their use. But by no means MACROs are the origin or the signature of a bad design. :)

          If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.

          In testa che avete, signor di Ceprano?

          1 Reply Last reply
          0
          • B BadKarma

            In the C++ community there is certain unhappy feeling towards the use of MACROs. In a post someone was given the advice to use a inline function instead of a MACRO. This is certainly good advice. Now my question is the following: Are there any reasons/issues or other situations where a MACRO can be preferred over another solution. Or should one 'try' to find a better C++ approach. One thing could be to decrease the amount of code, so it becomes more readable and less complex. Any thoughts on this?

            codito ergo sum

            E Offline
            E Offline
            Ed Poore
            wrote on last edited by
            #5

            The only time I would see as an advantage of using macros is when programming in C (I haven't used C++), an instance of this was some code I wrote for a company who shall remain anonymous where the biggest emphasis was on speed because it was performing rainflow analysis of vast quantities of data, all on a micro.  God forbid but most functions were eliminated in favour of copy and paste and gotos were used because the original idea was then to use an FPGA to do the analysis, i.e. perform it in hardware so because they don't have a concept of functions etc these were copied in and gotos were used because they're nice and fast, especially in hardware. In the end the other company decided to use a micro and refactored back my optimisations, then hit a problem, it was taking 4 times too long.  I was called in and noticed they were doing stupid things like calling these tiny little functions, if it the micro had been able to manage it it would have had to call this routine 1,000 / second (note this was only a tiny part of the entire, complex algorithm) so I changed the function into a macro so it "looked" like a function to them but actually wasn't. Of course I guess this is exactly what inline functions are for in C++ but most if not all C compilers don't support them.  So no I can't think of any good reason :rolleyes:

            1 Reply Last reply
            0
            • B BadKarma

              In the C++ community there is certain unhappy feeling towards the use of MACROs. In a post someone was given the advice to use a inline function instead of a MACRO. This is certainly good advice. Now my question is the following: Are there any reasons/issues or other situations where a MACRO can be preferred over another solution. Or should one 'try' to find a better C++ approach. One thing could be to decrease the amount of code, so it becomes more readable and less complex. Any thoughts on this?

              codito ergo sum

              S Offline
              S Offline
              Stephen Hewitt
              wrote on last edited by
              #6

              In general macros are bad and should be avoided. I don’t believe this “macros are bad full stop” line however; macros have their uses. And I'm not alone: The Boost libraries are highly acclaimed C++ libraries and they use macros when needed; Andrei Alexandrescu says he’s not afraid to use macros here[^].

              Steve

              1 Reply Last reply
              0
              • B BadKarma

                In the C++ community there is certain unhappy feeling towards the use of MACROs. In a post someone was given the advice to use a inline function instead of a MACRO. This is certainly good advice. Now my question is the following: Are there any reasons/issues or other situations where a MACRO can be preferred over another solution. Or should one 'try' to find a better C++ approach. One thing could be to decrease the amount of code, so it becomes more readable and less complex. Any thoughts on this?

                codito ergo sum

                A Offline
                A Offline
                alex barylski
                wrote on last edited by
                #7

                Macros are processed at pre-compile time, so they serve a purpose of course. Think the ASSERT in MFC. Can't do that with inlined functions. Well you could, but what a waste. MACROS some might argue, are bad practice. Personally, there have been many times while programming in JS or PHP where I have considered running my code through a pre-processor to gain the benefits of macro expansion. Ask any interpreted language developer with experience in C/C++ and they'd likely agree. When you program OOP, everything is an object, at least in a purists eyes. Using inline functions would seem messy and pointless. Are you going to throw all generic functions inside a class named CGeneric and call them statically? That would be hack, IMHO. In those cases where you need some simple code, that is common in more places than a single class, Macros are a good thing. Most Macros that I have used, such as LOWORD, etc...make sense as a macro, not an inlined function... So to answer your question, no Macros are not evil, the developers who use them inappropriately are. :) There are times when I write code, that is clean and effective but could be slightly more elegant or efficient if I could use a GOTO (no longer the case in most languages). I think macros, globals, goto's and even multiple inheritence can still be useful, but their use has to be completely understood and justified, otherwise they promote bad coding practice and you end up with crap. Then again, I've seen purist OO code with-out macros, globals, goto, or MI and it was crap too. Cheers :)

                I'm finding the only constant in software development is change it self.

                1 Reply Last reply
                0
                • R Rob Graham

                  BadKarma wrote:

                  One thing could be to decrease the amount of code, so it becomes more readable and less complex.

                  No, that is hiding complexity, not decreasing it. MACROS are a bad substitute for redesigning bad, unnecessarily complex code. They also make debugging more difficult. I can't think of any situation where a MACRO would be the preferred solution.

                  A Offline
                  A Offline
                  alex barylski
                  wrote on last edited by
                  #8

                  ASSERT & HIWORD/LOWORD are just two examples that came to mind. I certainly wouldn't use a inline function for either of those. :)

                  I'm finding the only constant in software development is change it self.

                  1 Reply Last reply
                  0
                  • B BadKarma

                    In the C++ community there is certain unhappy feeling towards the use of MACROs. In a post someone was given the advice to use a inline function instead of a MACRO. This is certainly good advice. Now my question is the following: Are there any reasons/issues or other situations where a MACRO can be preferred over another solution. Or should one 'try' to find a better C++ approach. One thing could be to decrease the amount of code, so it becomes more readable and less complex. Any thoughts on this?

                    codito ergo sum

                    S Offline
                    S Offline
                    sonofdelphi
                    wrote on last edited by
                    #9

                    When the intention is to abstract away repeating blocks of code which include things like "return", the only option is to use a macro. #define RETURN_IF_NULL(ptr) if(ptr==NULL) return FAILURE_NULL now, instead of the repetitively doing that null pointer check using three lines of code space, we can do it in one line, enabling us to focus on the "real" code. RETURN_IF_NULL(param1) RETURN_IF_NULL(param2) RETURN_IF_NULL(param3) This cannot be done using inline functions.

                    1 Reply Last reply
                    0
                    • B BadKarma

                      In the C++ community there is certain unhappy feeling towards the use of MACROs. In a post someone was given the advice to use a inline function instead of a MACRO. This is certainly good advice. Now my question is the following: Are there any reasons/issues or other situations where a MACRO can be preferred over another solution. Or should one 'try' to find a better C++ approach. One thing could be to decrease the amount of code, so it becomes more readable and less complex. Any thoughts on this?

                      codito ergo sum

                      M Offline
                      M Offline
                      me_stargazer
                      wrote on last edited by
                      #10

                      Actually just saying that MACROs are bad, is half knowledge. Many many platforms like MFC and ATL use MACROs extensively. The platform(Architecture) I work on is OS independent. In that case MACRO work as saviour. We can't use standard template because that would make code platform dependent so we have to USE MACRO to simulate templates. MACROs are an effective way to use the strength of preprocessor, if you use them correctly then they can really be useful. When some one says that avoid MACROs then the main intention is to avoid using it at the place of function. But the usage of MACROs are beyond that also where they would be indispensable.

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups