Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Совместная работа с С и С++ файлами. - Хелр! |
Автор: vnsk 23.7.2009, 12:47 |
1) С-файлы отлично компилируются в консольном проекте. 2) Изучаю MFC с помощью Визарда. - Тоже ок. 3) Подключаю С-файлы к п.2; - море ошибок... --- Пробовал у С-ишников заменить расширения на СРР. - Тоже много ошибок. Правда другие. --- Вставлял (по рекомендации инета) первой строкой #include "stdafx.h". Где-то компилируется, а где-то - еще один вариант ошибок. В частности - наотрез отказывается воспринимать конструкции С - goto METKA. --- Добавлял "ручкам" в опции компилятора /Tс и /Tp. Бывало улучшение, но эти опции "слетают" неконтролируемо от меня. ВОПРОСЫ: 1) Как корректно работать одновременно с С и С++ файлами? 2) Как корректно указать опции в зависимости от расширения? 3) Кто знает инфу на русском про "сабж"? - Линки, плз. |
Автор: InvalidProperty 23.7.2009, 13:16 |
вообще я лично сильно не заморачивался по этому поводу и, когда нужно было для какого-то уже имеющегося сишного файла создать проект, я так и делал: создавал проект и подключал к нему уже существующий файл. Честно говоря, не понимаю, в чем проблема у тебя |
Автор: bsa 23.7.2009, 13:42 |
vnsk, во-первых, как ты подключаешь си файл? Инклюдом или добавляешь в проект? Во-вторых, если нет крайней необходимости в MFC, то изучай что-нибудь более актуальное (Qt, например). |
Автор: vnsk 23.7.2009, 15:05 |
2bsa > Во-вторых, если нет крайней необходимости в MFC Я прилично знаю С. Сейчас на каникулах хочу освоить МФС (именно МФС!). Чтобы реализовать интерфейс для своих сишных функций. Проблему описал в заглавном топике. > во-первых, как ты подключаешь си файл В проект. В VC6 не нашел, где выставляются опции /Tc и /Tp. "Ручками" добавлял их в ProjectOptions... Но при добавлении,исключении файлов в проект эти опции "слетают". ТРЕБУЕТСЯ: ссылки на доки (на русском) или изложение собственного опыта. |
Автор: Леопольд 23.7.2009, 17:30 | ||||||
Листинг ошибок мог бы помочь. Телепатов, увы, здесь ещё не завелось. ![]() Добавлено @ 17:32
Полностью согласен. Хотя, можно не Qt а wxWidgets. ![]() Добавлено @ 17:37 Между С++ и С есть некоторые различия, навскидку помню только одно - void func() {} В С это эпсилон - void func(...) {} В С++ это функция без аргументов - void func(void) {} Добавлено через 11 минут и 15 секунд
У Страуструпа в приложении "Б.2. Совместимость С/С++" |
Автор: zim22 23.7.2009, 18:17 | ||
я на С не пишу, но боюсь его. вот:
![]() |
Автор: bsa 23.7.2009, 19:18 | ||||||
И чего испугался? Это устаревшая форма, сейчас не используется. (Кажется, современные компиляторы выдают варнинг на это).
Опять же, если у тебя нет особых причин работать с VS 6, то смени на что-нибудь современное. Потому что есть риск научиться писать "нестандартные" программы (VS 6 сильно не соответствует стандарту). Теперь охота посмотреть на ошибки, которые выдает компилятор. |
Автор: zim22 23.7.2009, 20:04 | ||||
испугался непривычной форма записи по сравнению с С++. вот ещё пример. всё http://codepad.org/7n6HTcrv без warning'oв.
*** после того, как я понял, что слово this не является ключевым, уже легче стало ![]() вобщем здесь
мы просто уточняем типы параметров. как всё просто оказалось ![]() |
Автор: vnsk 25.7.2009, 10:34 |
Спасибо всем ответившим, но... > ... Полностью согласен. Хотя, можно не Qt а wxWidgets > ... Qt - это удобная библиотека для создания GUI. Мало что с ней по удобству и охвату сравниться может. > ... Опять же, если у тебя нет особых причин работать с VS 6, то смени на что-нибудь современное. Ребята... я кроме С и Фортран знаю. Но сформулировал в теме четко: MFC + C; на VC6. Зачем оффтопик-шутки? > Добавлено @ 17:37 > Между С++ и С есть некоторые различия, навскидку помню только одно - void func() {} "Аднака" я спрашивал про опции компилятора. В различий не одно. Но речь не о них. > Цитата(vnsk @ 23.7.2009, 15:05) > ТРЕБУЕТСЯ: ссылки на доки (на русском) или изложение собственного опыта. > У Страуструпа в приложении "Б.2. Совместимость С/С++" До этого еще процесс не дошел. Тут только проблемы компилятора. > Теперь охота посмотреть на ошибки, которые выдает компилятор. Ок. Ниже мои мученья. Рассматривал процесс с учетом двух обстоятельств: А) насильного включения в С-шные файлы первой строчкой (по рекомендации инета) #include "stdafx.h" В) установки "ручкам" в опции компилятора /Tс и /Tp. Первый пункт - 2 варианта; второй - три. Итого = 6 вариантов. Привожу их все: A) !это - файл на С! //#include "stdafx.h" #include "header.h" int inc( int data ) { data = data + 1; return data; } B) !это - опции ProjectOptions! /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Debug/primer.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c ========================================= 1) нет "stdafx.h"; нет /Tc & /Tp; результат: Linking... primerView.obj : error LNK2001: unresolved external symbol "int __cdecl inc(int)" (?inc@@YAHH@Z) Debug/primer.exe : fatal error LNK1120: 1 unresolved externals 2) нет "stdafx.h"; есть /Tc; результат: Compiling... StdAfx.cpp c:\...\vc98\mfc\include\afx.h(15) : fatal error C1189: #error : MFC requires C++ compilation (use a .cpp suffix) Error executing cl.exe. 3) нет "stdafx.h"; есть /Tp; результат: primer.exe - 0 error(s), 0 warning(s) 4) есть "stdafx.h"; нет /Tc & /Tp; результат: prim.C c:\...\vc98\mfc\include\afx.h(15) : fatal error C1189: #error : MFC requires C++ compilation (use a .cpp suffix) Error executing cl.exe. primer.exe - 1 error(s), 0 warning(s) 5) есть "stdafx.h"; есть /Tc; результат: Compiling... tdAfx.cpp c:\...\vc98\mfc\include\afx.h(15) : fatal error C1189: #error : MFC requires C++ compilation (use a .cpp suffix) Error executing cl.exe. 6) есть "stdafx.h"; есть /Tp; результат: primer.exe - 0 error(s), 0 warning(s) P.S. Моя функция вызывалась вот так: ///////////////////////////////////////////////////////////////////////////// // CPrimerView message handlers void CPrimerView::OnPrimerGo() { // TODO: Add your command handler code here char buffer[20]; data = inc(data); // моя функция на С _itoa(data,buffer,10); AfxMessageBox(buffer); } ========================================================= ВОПРОСЫ: 1) Действительно ли необходимо включение в С-файлы #include "stdafx.h" ? 2) Действительно ли опция компилятора /Tp убирает конфликты, когда в проекте одновременно С и СРР файлы? 3) КАК (в оболочке VC6) выставляется эта опция? - Я так и не нашел, а "ручками" набивать - нетрудно, но сомнительно... 4) Почему опция /Tp неконтролируемо "слетает" после удаления/добавления в проект файлов? Заранее спасибо ответившим по-существу. d:) |
Автор: bsa 26.7.2009, 09:25 | ||||||||
1. нет (более того, это вредно; этот stdafx.h необходим, чтобы работала кривая (имхо) реализация прекомпиляции заголовочных файлов, в других компиляторах этого требования нет) 2. нет, она просто http://msdn.microsoft.com/en-us/library/032xwy55(VS.80).aspx (документацию читать не приучен?) 3. а зачем? Это хак. 4. читай пп. 2 и 3. Все ясно. В Си и С++ разные сигнатуры у функций. Т.е. когда ты пишешь: int inc(int a); То компилятор С++ создает символ "?inc@@YAHH@Z". А компилятор Си: "inc" Чтобы таких проблем не было, в С++ введена специальная конструкция extern "C", которая ставится перед объявлением функции и говорит компилятору, что необходимо генерировать символы в стиле Си:
Так как каждый раз писать extern "C" любому мало мальски уважающему себя программисту лень, то делается специальная обертка вокруг объявлений функций (ее, кстати, ты мог легко подсмотреть в stdio.h, например):
|
Автор: vnsk 26.7.2009, 12:09 |
2bsa Спасибо за развернутый ответ. > Тебе вполне серьезно было порекомендовано по возможности отказаться от > использования устаревшего решения в пользу более современного и удобного. Я сразу ответет "нет". И это не каприз... ![]() > Чтобы таких проблем не было, в С++ введена специальная конструкция extern "C", > которая ставится перед объявлением функции и говорит компилятору, что необходимо > генерировать символы в стиле Си: > 2. ... (документацию читать не приучен?) Читаю, но сложно самостоятельно расставить приоритеты по темам... Но вот, уже наверстываю! Когда "через задницу" заставил компилироваться код, перешел в своих файлах (С) к расширению СРР. Не ожидал, что исправлений потребовалось немного. В осовном - приведение типов функций; на "С" удобно было описывать void* fun() и все присвивания шли без помарок. --- ВОПРОС: насколько жизненно использование С-кода в С++ проектах? С точки зрения надежности. Т.к. у меня в основном "арифметика", то сомневаюсь в достаточно сложных структурах (смесь всего и вся). |
Автор: bsa 27.7.2009, 10:42 |
vnsk, WinAPI - написан на Си. Любая программа на С++ под Windows явно или неявно использует WinAPI... |