Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(vnsk @ 23.7.2009,  12:47)
море ошибок...

Листинг ошибок мог бы помочь. Телепатов, увы, здесь ещё не завелось. smile

Добавлено @ 17:32
Цитата(bsa @ 23.7.2009,  13:42)
Во-вторых, если нет крайней необходимости в MFC, то изучай что-нибудь более актуальное (Qt, например).

Полностью согласен. Хотя, можно не Qt а wxWidgets.  smile

Добавлено @ 17:37
Между С++ и С есть некоторые различия, навскидку помню только одно - void func() {}

В С это эпсилон - void func(...) {}
В С++ это функция без аргументов - void func(void) {}

Добавлено через 11 минут и 15 секунд
Цитата(vnsk @ 23.7.2009,  15:05)
ТРЕБУЕТСЯ: ссылки на доки (на русском) или изложение собственного опыта.

У Страуструпа в приложении "Б.2. Совместимость С/С++"

Автор: zim22 23.7.2009, 18:17
Цитата(Леопольд @  23.7.2009,  17:30 Найти цитируемый пост)
Между С++ и С есть некоторые различия

я на С не пишу, но боюсь его. вот:
Код

void g(p) struct stack *p; { }

smile

Автор: bsa 23.7.2009, 19:18
Цитата(zim22 @ 23.7.2009,  18:17)
я на С не пишу, но боюсь его. вот:
Код

void g(p) struct stack *p; { }

smile

И чего испугался? Это устаревшая форма, сейчас не используется. (Кажется, современные компиляторы выдают варнинг на это).

Цитата(vnsk)
Я прилично знаю С. Сейчас на каникулах хочу освоить МФС (именно МФС!). Чтобы реализовать интерфейс для своих сишных функций.
Я не оспариваю твои знания языка Си. Но он тут не причем, так как MFC и Qt (да и wxWidgets) - это для С++. Просто MFC уже не актуальна. Ее нужно учить только если заставляют (преподаватели) или требуют работодатели (так как видимо у них есть старый проект на MFC, который нужно поддерживать). Qt - это удобная библиотека для создания GUI. Мало что с ней по удобству и охвату сравниться может.

Опять же, если у тебя нет особых причин работать с VS 6, то смени на что-нибудь современное. Потому что есть риск научиться писать "нестандартные" программы (VS 6 сильно не соответствует стандарту).

Теперь охота посмотреть на ошибки, которые выдает компилятор.

Автор: zim22 23.7.2009, 20:04
Цитата(bsa @  23.7.2009,  19:18 Найти цитируемый пост)
И чего испугался? Это устаревшая форма, сейчас не используется

испугался непривычной форма записи по сравнению с С++.
вот ещё пример.  всё http://codepad.org/7n6HTcrv без warning'oв.
Код

void f(this, c)
struct foo *this;
char c; { }

***
после того, как я понял, что слово this не является ключевым, уже легче стало smile
вобщем здесь
Код

struct foo *this;
char c; { }

мы просто уточняем типы параметров. как всё просто оказалось smile

Автор: 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" int inc(int a);
Обычно, ее используют в хидерах (это твой случай, кстати). Хотя, случается, и в cpp файлах, например, при создании DLL...
Так как каждый раз писать extern "C" любому мало мальски уважающему себя программисту лень, то делается специальная обертка вокруг объявлений функций (ее, кстати, ты мог легко подсмотреть в stdio.h, например):
Код
//...
#ifdef __cplusplus //только если хидер компилируется компилятором С++
extern "C" {
#endif //__cplusplus

int inc(int a);
//Объявления других твоих функций тоже тут

#ifdef __cplusplus
} //extern "C"
#endif //__cplusplus
//...


Цитата(vnsk)
Ребята... я кроме С и Фортран знаю. Но сформулировал в теме четко:  MFC + C; на VC6. 
Зачем оффтопик-шутки?
А кто тебе сказал, что это шутки? Тебе вполне серьезно было порекомендовано по возможности отказаться от использования устаревшего решения в пользу более современного и удобного.
Цитата(vnsk)
До этого еще процесс не дошел. Тут только проблемы компилятора.
Да нет, тут именно те самые проблемы, до которых "еще процесс не дошел".

Автор: vnsk 26.7.2009, 12:09
2bsa
Спасибо за развернутый ответ.

> Тебе вполне серьезно было порекомендовано по возможности отказаться от 
> использования устаревшего решения в пользу более современного и удобного.
Я сразу ответет "нет". И это не каприз...  smile

> Чтобы таких проблем не было, в С++ введена специальная конструкция extern "C", 
> которая ставится перед объявлением функции и говорит компилятору, что необходимо 
> генерировать символы в стиле Си:
> 2. ... (документацию читать не приучен?)
Читаю, но сложно самостоятельно расставить приоритеты по темам... Но вот, уже наверстываю!

Когда "через задницу" заставил компилироваться код, перешел в своих файлах (С) к расширению СРР. Не ожидал, что исправлений потребовалось немного. В осовном - приведение типов функций; на "С" удобно было описывать  void* fun() и все присвивания шли без помарок.
---
ВОПРОС: насколько жизненно использование С-кода в С++ проектах? С точки зрения надежности. Т.к. у меня в основном "арифметика", то сомневаюсь в достаточно сложных структурах (смесь всего и вся). 


Автор: bsa 27.7.2009, 10:42
vnsk, WinAPI - написан на Си. Любая программа на С++ под Windows явно или неявно использует WinAPI...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)