Определение возможностей конкретного неизвестного компилятора С и С++

Как программно на С и/или С++ получить полную информацию(всё поддерживаемые типы, функции, макросы и т.д.) о возможностях конкретного неизвестного компилятора, в т.ч. встроенного в известную IDE(например CxxDroid v.5.2 и др.)?


Ответы (1 шт):

Автор решения: avp

Я думаю, вы просто что-то не то наформатировали в строке, которую передаете в popen.

Вот самый простой вариант на Си, практически без проверок (у менят нет clang, использую gcc, но это не принципиально...)

#include <stdio.h>

int
main (int ac, char *av[])
{
  FILE *f = popen("echo | gcc -dM -E -", "r");
  if (f) {
    char s[1000];
    int n = 0;
    while (fgets(s, 1000, f)) {
      n++;
      printf("%4d %s", n, s);
    }

    pclose(f);
  }

  return puts("\nEnd") == EOF;
}

Компилирую и запускаю:

avp@avp-desktop:~/avp/Bailkal/tst$ gcc t-popen.c && ./a.out 
   1 #define __SSP_STRONG__ 3
   2 #define __DBL_MIN_EXP__ (-1021)
   3 #define __FLT32X_MAX_EXP__ 1024
   4 #define __UINT_LEAST16_MAX__ 0xffff
   5 #define __ATOMIC_ACQUIRE 2
.....
.....
 344 #define __INT_LEAST64_WIDTH__ 64
 345 #define __UINT_FAST8_TYPE__ unsigned char
 346 #define __ATOMIC_ACQ_REL 4
 347 #define __ATOMIC_RELEASE 3

End
avp@avp-desktop:~/avp/Bailkal/tst$ 

Что вы называете потоковым вводом-выводом, которого вроде бы нет в Си, я не понимаю. Обычно FILE * также называют и потоком ... (вообще, для большинства подобных программ, которые последовательно читают данные, совершенно не важно с чем именно (терминалом, pipe, socket, файл на диске и т.д. и т.п.) связан FILE *)
(K&R еще не прочли?)

→ Ссылка