How can I use "sizeof" in a preprocessor macro?

c, gcc

Solution

There are several ways of doing this. Following snippets will produce no code if `sizeof(someThing)` equals `PAGE_SIZE`; otherwise they will produce a compile-time error.

1. C11 way

Starting with C11 you can use `static_assert` (requires `#include <assert.h>`).

Usage:

static_assert(sizeof(someThing) == PAGE_SIZE, "Data structure doesn't match page size");

2. Custom macro

If you just want to get a compile-time error when `sizeof(something)` is not what you expect, you can use following macro:

#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))

Usage:

BUILD_BUG_ON( sizeof(someThing) != PAGE_SIZE );

This article explains in details why it works.

3. MS-specific

On Microsoft C++ compiler you can use C_ASSERT macro (requires `#include <windows.h>`), which uses a trick similar to the one described in section 2.

Usage:

C_ASSERT(sizeof(someThing) == PAGE_SIZE);

Problem

Is there any way to use a `sizeof` in a preprocessor macro? For example, there have been a ton of situations over the years in which I wanted to do something like: ``` #if sizeof(someThing) != PAGE_SIZE #error Data structure doesn't match page size #endif ``` The exact thing I'm checking here is completely made up - the point is, I often like to put in these types of (size or alignment) compile-time checks to guard against someone modifying a data-structure which could misalign or re-size things which would break them. Needless to say - I don't appear to be able to use a `sizeof` in the manner described above.

Original source

Related problems