Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

compiler can't find "aligned_alloc" function

Tags:

c++

c

Trying to get a portable function to allocate on heap with aligned feature.

Found "aligned_alloc", which I think is in stdlib.h but gcc seems to not think so

error: 'aligned_alloc' was not declared in this scope

using gcc with flags -std=c++11 -m64

tried importing

#include <stdlib.h>
#include <cstdlib>
like image 671
Thomas Avatar asked Mar 25 '15 03:03

Thomas


1 Answers

aligned_alloc is defined in C11. It is not (yet) defined for C++, although it may show up in C++17. (That is, it is not in the list of (currently) 209 functions in the standard C library which are expected to be available in the standard C++ library. See Appendix C of the C++ standard.)

(Update August 2018: aligned_alloc is indeed defined by C++17, as predicted above. So you if you have a sufficiently recent C++ compiler, you should be able to avoid all the messing around with feature-test macros by just specifying the use of C++17; for g++ and clang++, that can be done with the -std=c++17 command-line flag.)

If you want to use it with GCC (or, more specifically, with g++), you should use the feature test macro _ISOC11_SOURCE. Like all feature test macros, this macro must be #define'd in every file which requires it before any #include. [See note 1] (The feature test macro would not be necessary if you were compiling a C program with -std=c11.)

I found the correct feature test macro from man aligned_alloc:

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

  posix_memalign(): _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600

  aligned_alloc(): _ISOC11_SOURCE

As that indicates, you can read

man 7 feature_test_macros

for more information on feature test macros, including a list of the macros recognized by glibc, and when each one applies.

The aligned_alloc manpage also documents the very similar posix_memalign function, which has been part of the Posix standard since Issue 6, and which has different (and more common) feature test macros, as indicated above. posix_memalign should be portable to any Posix system, which might or might not include more systems than those that accept the use of a C11 function in C++.

Notes

  1. This means you shouldn't put the #define in a header file, since the header file cannot be included before the first include :) However, if you use something like #include "config.h" to include platform definitions, and every source file starts with #include "config.h", prior to any other #include, and the #define occurs in config.h prior to any #include, you should be OK.
like image 88
rici Avatar answered Oct 22 '22 21:10

rici