Getting include cpp include requests

How to get the system, including C preprocessor search paths? This is for a script that parses arbitrary source files and needs to know the full paths to the headers that they #include. Let it ignore for a moment that the user can change this sequence of search paths using compiler flags. I would prefer a solution that uses the standard tools found on POSIX systems, so my script depends on nothing.

I tried:

cpp -v </dev/null | unusually_complex_filter

But this does not seem to take into account such things as $C{,PLUS}_INCLUDE_PATH. To find out where the vector is #include <vector>, I need to know the search paths in their exact order.

+3
source share
3

, C. , .

, , POSIX- c99 -E, . POSIX , , .

0

test.cpp :

#include <string>
#include <iostream>

int main(int, char **)
{
  return 0
}

cpp gcc toolsuite, :

cpp test.cpp | grep '^#.*' | awk '{print $3}'

"test.cpp"
"<built-in>"
"<command-line>"
"test.cpp"
"/usr/include/c++/4.4/string"
"/usr/include/c++/4.4/string"
"/usr/include/c++/4.4/string"
"/usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h"    
"/usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h"
"/usr/include/c++/4.4/x86_64-linux-gnu/bits/os_defines.h"

.

, "", include.

0

chat, , , cpp .

, -x ( -v- , ), - ( , Intel , ), , cpp, , , :

$ cpp --version  # my cpp is from gcc
cpp (Ubuntu 4.4.3-4ubuntu5) 4.4.3
...
$ cpp -v </dev/null 2>&1 1>/dev/null | sed -nr 's/^ ([^ ]+)$/\1/p'
/usr/local/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
/usr/include/i486-linux-gnu
/usr/include
$ cpp -v -x c++ </dev/null 2>&1 1>/dev/null | sed -nr 's/^ ([^ ]+)$/\1/p'
/usr/include/c++/4.4
/usr/include/c++/4.4/i486-linux-gnu
/usr/include/c++/4.4/backward
/usr/local/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
/usr/include/i486-linux-gnu
/usr/include

, script :

$ mkdir my-include  # or else cpp ignores it
$ cpp -Imy-include -v -x c++ </dev/null 2>&1 1>/dev/null | sed -nr 's/^ ([^ ]+)$/\1/p'
my-include
/usr/include/c++/4.4
/usr/include/c++/4.4/i486-linux-gnu
/usr/include/c++/4.4/backward
/usr/local/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
/usr/include/i486-linux-gnu
/usr/include

- , > " (" " < > paths). cpp , .

0
source

Source: https://habr.com/ru/post/1769933/


All Articles