Определение возможностей конкретного неизвестного компилятора С и С++
Как программно на С и/или С++ получить полную информацию(всё поддерживаемые типы, функции, макросы и т.д.) о возможностях конкретного неизвестного компилятора, в т.ч. встроенного в известную IDE(например CxxDroid v.5.2 и др.)?
Ответы (1 шт):
Я думаю, вы просто что-то не то наформатировали в строке, которую передаете в 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 еще не прочли?)