C11 Support in Intel C++ Compiler

The following C11 features are supported by Intel(R) C++ compiler that comes with Intel® Parallel Studio XE and Intel® System Studio.

C11 Language FeatureVersion 15.0Version 16.0Version 17.0Version 18.0
Static AssertYesYesYesYes
Typedef redefinition-YesYesYes
Anonymous struct and union-YesYesYes
New macros in float.h-YesYesYes
_Alignas, _Alignof,max_align_t,stdalign.h-YesYesYes
Atomic operations-YesYesYes
Macros for Complex values-YesYesYes
Unicode strings-YesYesYes
__STDC_VERSION__ == 201112L-YesYesYes


1. The C11 features are only supported when GNU* gcc in path is 4.6 or higher.
2. On Linux: The C11 features supported by gcc on the path are enabled by default. Use "-std=c11" or "-std=c1x" to turn on the support for all other cases.
3. On macOS*: The C11 features supported by gcc on the path are enabled by default. Use "-std=c11" to turn on the support for all other cases.
4. On Windows: The C11 features can be enabled on Windows using "/Qstd=c11" compiler option

Other relevant articles:

GNU GCC C11 support status: https://gcc.gnu.org/wiki/C11Status 
GNU GCC C99 support status: https://gcc.gnu.org/c99status.html
Intel Compiler C99 support status: https://software.intel.com/en-us/articles/c99-support-in-intel-c-compiler


For more complete information about compiler optimizations, see our Optimization Notice.


Jaime A. (Intel)'s picture

When using the atomic operations, icc 18.0.1 generates some warnings though. For instance, for the following code, icc says that the type for atomic_fetch_add() should be void* instead of atomic_int*. I tried it with gcc 4.9.2 and 6.2 on path. No warnings when compiled with those gcc or clang 6.0.0.

#include <stdlib.h>
#include <assert.h>
#include <stdatomic.h>
#include <stdio.h>

volatile atomic_int cnt0;
volatile _Atomic int cnt1;

int main(void)
        cnt0 = 0;
        cnt1 = 0;
        atomic_fetch_add(&cnt0, 2);
        atomic_fetch_add(&cnt1, 3);

        printf("The atomic counters are %u and %u\n", cnt0, cnt1);

        return 0;
$ icc ./test-atomics.c -o test-atomics -Wall -std=c11
./test-atomics.c(14): warning #2330: argument of type "volatile atomic_int={_Atomic(int)} *" is incompatible with parameter of type "volatile void *" (dropping qualifiers)
        atomic_fetch_add(&cnt0, 2);

./test-atomics.c(15): warning #2330: argument of type "volatile _Atomic(int) *" is incompatible with parameter of type "volatile void *" (dropping qualifiers)
        atomic_fetch_add(&cnt1, 3);
$ ./test-atomics
The atomic counters are 2 and 3


Nathan H.'s picture

Jeff, that clarification would be welcome. I am happy to report that *finally* icc actually supports C11 atomics:

#include <stdlib.h>
#include <assert.h>
#include <stdatomic.h>
#include <stdio.h>

int main () {
  atomic_int foo = 0;
  printf ("Foo is %d\n", foo);
  return 0;


Foo is 1


Nathan H.'s picture

Any word on when icc will support the _Atomic keyword? Its an odd feature to be missing.

Ohh, and icc doesn't support arithmetic operations on atomic_* types. That means the atomic support is definitely not C11 compliant.

Jeff (Intel)'s picture

You might want to document that stdatomic.h is supported, and the C11 atomics API is supported, with the exception of _Atomic.  I've personally verified that this is the case in Intel 16 and 17, although not exhaustively.

Add a Comment

Have a technical question? Visit our forums. Have site or software product issues? Contact support.