Могу ли я использовать векторы C в коде C в VS2008

#c #c

#c #c

Вопрос:

я запускаю код c в vs2008. Мне было любопытно, могу ли я смешать этот код с кодом c

Комментарии:

1. Я думал, что в Visual Studio в любом случае есть только компилятор C ; у него нет компилятора C. Итак, если ваш код вообще компилируется, то вы уже в порядке.

2. @Kerrek SB: У него есть /TC флаг. Не идеальный режим C, но достаточно близкий (IIRC использует общее подмножество C и C )

Ответ №1:

Короткий ответ — да. Однако есть некоторые нюансы.

C обычно поддерживает большое подмножество C. Это означает, что вы можете использовать практически все, что доступно на C (например, функции, библиотеки и т.д.) Из кода C . С этого момента у вас есть два варианта: простой и немного сложнее.

Вариант № 1 — Использовать компилятор C .

Просто обработайте свой код как C . Проще говоря — используйте компилятор C .

Вариант № 2 — смешать C и C .

Вы можете написать свой код на C и скомпилировать его с помощью компилятора C . Используйте C-подобный C , где вам нужно использовать компоненты C . Например, у вас может быть настройка, подобная следующей:

  • head1.h — объявления ваших функций C. Например:

    void foo1();

  • header2.h — объявления ваших функций C, которые намерены использовать код C .

     #ifdef __cplusplus
    extern "C" {
    #endif
        void foo2 ();
    #ifdef __cplusplus
    }
    #endif
      

И два исходных файла, один C и один C :

  • source1.c

     #include "header1.h"
    #include "header2.h"
    
    void foo1 ()
    {
       foo2 (); /* Call a C function that uses C   stuff */
    }
      
  • source2.cpp

     #include <vector>
    #include "header2.h"
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    void foo2 ()
    {
        std::vector<int> data;
        /// ... etc.
    }
    
    #ifdef __cplusplus
    }
    #endif
      

Конечно, вам придется скомпилировать файлы «cpp» с помощью компилятора C (но вы все равно можете скомпилировать файлы «c» с помощью компилятора C) и связать вашу программу со стандартной средой выполнения C .

Например, аналогичный (но немного более сложный) подход используется Apple. Они смешивают C и Objective-C, вызывая гибридный Objective-C .

Обновить:

Если вы решите компилировать код C как C , я рекомендую вам потратить некоторое время на изучение различий между C и C . Бывают случаи, когда код может быть как легальным C, так и C , но давать разные результаты. Например:

 extern int T;

int main()
{
    struct T { int a; int b; };
    return sizeof(T)   sizeof('T');
}
  

Если это программа на C, то правильный ответ — 8. В случае C ответ равен 9. Я объяснил это более подробно в своем сообщении в блоге здесь.

Надеюсь, это поможет. Удачи!

Ответ №2:

Если вы компилируете свой код с использованием компилятора C в качестве программы на C , вы можете использовать std::vector .
Если вы компилируете свой код с использованием компилятора C в качестве программы на C, то вы не можете.

Это связано с тем, что std::vector это тип, определенный стандартом C , стандарт C не определяет какой-либо тип как std::vector .

Простыми словами, компилятор C не понимает, что std::vector такое.

Комментарии:

1. Придирка: компилятор тот же; это всего лишь переключатель режимов для переключения между C и C . / Придирка

2. извините за неправильное понимание OP, я удалю свои комментарии.

3. @amit: Неважно, я тоже удалил свой. Счастливый конец. 🙂

Ответ №3:

Есть переключатель для компиляции файлов .c как C (/ TP) . Если вы включите это, вы можете использовать c как C . Имейте в виду, что некоторый код c не будет компилироваться как C без изменений (в основном это связано с приведением типов; c имеет более строгие правила для этого).

Ответ №4:

Если вы взаимодействуете с какой-либо существующей библиотекой C, то вы, конечно, можете использовать C . Если вы компилируете как C, вы не сможете использовать какие-либо функции C , такие как std::vector .