C против C ++ с использованием компилятора cl в VS2015

Как компилятор cl узнает, собираю ли я код на C или C ++?
Нужно ли указывать компилятору?
У меня заканчивается командная строка разработчика для VS2015. Первоначально я начал этот проект с кода на c ++, который компилировался и работал на ПК с RedHat Linux. Я переместил его в WIN7, и он не скомпилировался бы под компилятором cl, если бы я не избавился от конструкций c ++ и не реализовал эквиваленты C.
Конструктор в заголовочном файле был одной из проблем, с которыми мне пришлось работать.

3

Решение

Как задокументировано в MSDN, сначала он смотрит на расширение имени файла. Если это .cpp или .cxx, то по умолчанию это компиляция C ++. Почти всегда достаточно хорош, чтобы сделать работу. На этой же странице показано, как форсировать выделение, используйте / Tc для C и / Tp для C ++. Вы бы использовали / TC и / TP, чтобы принудительно установить его для всех исходных файлов.

5

Другие решения

Расширения файлов дадут эту информацию.

.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

  1. Откройте проект Страницы собственности диалоговое окно. Подробнее см. Как
    чтобы: Откройте страницу свойств проекта.
  2. Нажмите на C / C ++ папка.
  3. Нажмите на продвинутый страница свойств.
  4. Изменить Компилировать как имущество.

И пример, также взятый из документов.

В следующей командной строке 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
4