Skip to main content

+1 866 653-6233 LinkedIn Software Expert Witness Directory

About Us Contact Us

Barr Group Software Experts

Barr Group Software Experts

Main navigation

  • Expert Services
    • Consulting Experts in Software and Electronics
    • Expert Reports by Testifying Software Experts
    • Reverse Engineering and Forensic Analysis
    • Software Source Code Review and Analysis
  • Areas of Expertise
    • Left Side
      • Artificial Intelligence
      • Automotive Systems
      • Cloud Computing
      • Computer Security
      • Consumer Electronics
      • Electronic Circuits
      • Enterprise Software
      • Financial Technology
      • Firmware and IoT
    • Right Side
      • Industrial Controls
      • Mechanical Design
      • Medical Devices
      • Military & Aerospace
      • Mobile Devices & Apps
      • Optical Equipment
      • Renewable Energy
      • Signal Processing
      • Telecommunications
  • Matters & Venues
    • Patent Infringement and Invalidity Experts
    • Software Copyright and Trade Secrets Experts
    • Product Liability and Failure Analysis Experts
    • Contract Disputes and Software Project Failures
    • Venues and Clients
  • Directory
  • Case Studies
    • DirecTV Anti-Piracy
    • Samsung Software Copyright
    • Toyota Runaway Cars
  • Resources
    • Expert Witness Blog
    • Source Code Review in Litigation
    • Software Source Code Discovery

6.3 Function-Like Macros

  1. Home
  2. Embedded C Coding Standard
  3. 6 Procedure Rules
  4. 6.3 Function-Like Macros

Rules:

6.3.a. Parameterized macros shall not be used if a function can be written to accomplish the same behavior.

6.3.b. If parameterized macros are used for some reason, these rules apply:

          i. Surround the entire macro body with parentheses.

         ii. Surround each use of a parameter with parentheses.

        iii. Use each parameter no more than once, to avoid unintended side effects.

         iv. Never include a transfer of control (e.g., return keyword).

Example:

// Don’t do this ...
#define MAX(A, B)  ((A) > (B) ? (A) : (B))

// ... when you can do this instead.
inline int max(int num1, int num2)

Reasoning: There are a lot of risks associated with the use of preprocessor defines, and many of them relate to the creation of parameterized macros. The extensive use of parentheses (as shown in the example) is important, but does not eliminate the unintended double increment possibility of a call such as MAX(i++, j++). Other risks of macro misuse include comparison of signed and unsigned data or any test of floating-point data.  Making matters worse, macros are invisible at run-time and thus impossible to step into within the debugger.

Where performance is important, note that C99 added C++’s inline keyword.

Enforcement: 

These rules shall be enforced during code reviews.

Book traversal links for 6.3 Function-Like Macros

  • ‹ 6.2 Functions
  • Up
  • 6.4 Threads of Execution ›

Request an Expert

(866) 653-6233

Barr Group logo
Call us

Expert Services

  • Source Code Review Services
  • Expert Witness Directory
  • Reverse Engineering Services
  • Expert Reports & Testimony
  • How-To Technical Articles
  • Engineering Services

Latest Insights

  • Payment Processing and e-Payments Fraud
  • Albert Einstein Expert Witness
  • Medical Device Litigation and FDA 510(k)
  • Personality Traits of the Best Expert Witnesses

Website contents copyright © 2012-2025 by Barr Group. | Barr Group's logo is a U.S.-registered ® trademark.

SITEMAP  |  PRIVACY