Как компилятор cl узнает, собираю ли я код на C или C ++?
Нужно ли указывать компилятору?
У меня заканчивается командная строка разработчика для VS2015. Первоначально я начал этот проект с кода на c ++, который компилировался и работал на ПК с RedHat Linux. Я переместил его в WIN7, и он не скомпилировался бы под компилятором cl, если бы я не избавился от конструкций c ++ и не реализовал эквиваленты C.
Конструктор в заголовочном файле был одной из проблем, с которыми мне пришлось работать.
Как задокументировано в MSDN, сначала он смотрит на расширение имени файла. Если это .cpp или .cxx, то по умолчанию это компиляция C ++. Почти всегда достаточно хорош, чтобы сделать работу. На этой же странице показано, как форсировать выделение, используйте / Tc для C и / Tp для C ++. Вы бы использовали / TC и / TP, чтобы принудительно установить его для всех исходных файлов.
Расширения файлов дадут эту информацию.
.c
файлы для C и .cpp
файлы для C ++. Проверьте эта ссылка для деталей.
Также я нашел этот код Вот показать C
или же C++
использовался компилятор:
Код ниже содержит стандартные, предопределенные макросы, используемые во время выполнения
определить, использовался ли компилятор C или C ++ для компиляции кода.
Для компиляторов Си это также определяет версию языка Си
стандарт, который реализует компилятор). ПРИМЕЧАНИЕ: некоторые люди предпочитают
использовать STDC_HEADERS вместо STDC..
#ifdef __cplusplus
printf("C++ compiler\n");
#else
#ifdef __STDC__
#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) ||/*continue..
...on the next line */ (defined(__GNUC__) && !defined(__STRICT_ANSI__))
printf("ANSI X3.159-1999 / ISO 9899:1999 (C99) compiler\n");
#else
printf("ANSI X3.159-1989 (C89) / ISO/IEC 9899:1990 (C90) C compiler\n");
#endif
#else
printf("Pre-ANSI (K&R) C compiler\n");
#endif
#endif
Приведенный ниже код определяет, использовался ли компилятор C или C ++ для
скомпилировать код во время выполнения:
if (sizeof('c') != sizeof(int)) printf("C++ compiler\n");
else if ((unsigned char)1 < -1) printf("Pre-ANSI (K&R) C compiler\n");
else { int i; i = 1 //* */
+1;
if (i == 2) printf("ANSI X3.159-1999 / ISO 9899:1999 (C99) compiler\n");
else printf("ANSI X3.159-1989 (C89) / ISO/IEC 9899:1990 (C90) C compiler\n");}
Просто чтобы не полагаться полностью на ссылку, вот информация из документов:
замечания
По умолчанию CL предполагает, что файлы с расширением .c являются источником C
файлы и файлы с расширением .cpp или .cxx являются источником C ++
файлы. Если указана опция TC или Tc, любая спецификация
параметра / Zc: wchar_t (wchar_t Is Native Type) игнорируется. Установить
эта опция компилятора в среде разработки Visual Studio
И пример, также взятый из документов.
В следующей командной строке CL указано, что TEST1.c, TEST2.cxx,
TEST3.huh и TEST4.o скомпилированы как файлы C ++, а TEST5.z
скомпилирован как файл C.
CL TEST1.C TEST2.CXX TEST3.HUH TEST4.O /Tc TEST5.Z /TP