Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совместная работа с С и С++ файлами. - Хелр! Пытаюсь в MFC-проекте подключить С-файлы 
:(
    Опции темы
vnsk
Дата 23.7.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.7.2009

Репутация: нет
Всего: нет



1) С-файлы отлично компилируются в консольном проекте.
2) Изучаю MFC с помощью Визарда. - Тоже ок.
3) Подключаю С-файлы к п.2; -  море ошибок...
---
Пробовал у С-ишников заменить расширения на СРР. - Тоже много ошибок. Правда другие.
---
Вставлял (по рекомендации инета)  первой строкой     #include "stdafx.h".   Где-то компилируется, а где-то - еще один вариант ошибок.  В частности - наотрез отказывается воспринимать конструкции С  - goto METKA.
---
Добавлял "ручкам" в опции компилятора /Tс и  /Tp.  Бывало улучшение, но эти опции "слетают" неконтролируемо от меня.


ВОПРОСЫ:
1) Как корректно работать одновременно с С и С++ файлами?
2) Как корректно указать опции в зависимости от расширения?
3) Кто знает инфу на русском про "сабж"? - Линки, плз.


PM MAIL   Вверх
InvalidProperty
Дата 23.7.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

Репутация: 2
Всего: 9



вообще я лично сильно не заморачивался по этому поводу и, когда нужно было для какого-то уже имеющегося сишного файла создать проект, я так и делал: создавал проект и подключал к нему уже существующий файл. Честно говоря, не понимаю, в чем проблема у тебя


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
bsa
Дата 23.7.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



vnsk, во-первых, как ты подключаешь си файл? Инклюдом или добавляешь в проект?
Во-вторых, если нет крайней необходимости в MFC, то изучай что-нибудь более актуальное (Qt, например).
PM   Вверх
vnsk
Дата 23.7.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.7.2009

Репутация: нет
Всего: нет



2bsa
> Во-вторых, если нет крайней необходимости в MFC
Я прилично знаю С. Сейчас на каникулах хочу освоить МФС (именно МФС!). Чтобы реализовать интерфейс для своих сишных функций.

Проблему описал в заглавном топике.

> во-первых, как ты подключаешь си файл
В проект.
В VC6 не нашел, где выставляются опции /Tc  и  /Tp. "Ручками" добавлял их в ProjectOptions... Но при добавлении,исключении файлов в проект эти опции "слетают".

ТРЕБУЕТСЯ: ссылки на доки (на русском) или изложение собственного опыта.
PM MAIL   Вверх
Леопольд
Дата 23.7.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(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. Совместимость С/С++"

Это сообщение отредактировал(а) Леопольд - 23.7.2009, 17:38


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 23.7.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



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

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

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

smile


--------------------
PM MAIL   Вверх
bsa
Дата 23.7.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(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 сильно не соответствует стандарту).

Теперь охота посмотреть на ошибки, которые выдает компилятор.
PM   Вверх
zim22
Дата 23.7.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



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

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

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

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

struct foo *this;
char c; { }

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


--------------------
PM MAIL   Вверх
vnsk
Дата 25.7.2009, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.7.2009

Репутация: нет
Всего: нет



Спасибо всем ответившим, но...

> ... Полностью согласен. Хотя, можно не 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:)

PM MAIL   Вверх
bsa
Дата 26.7.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



1. нет (более того, это вредно; этот stdafx.h необходим, чтобы работала кривая (имхо) реализация прекомпиляции заголовочных файлов, в других компиляторах этого требования нет)
2. нет, она просто заставляет файл Си компилироваться компилятором С++ (документацию читать не приучен?)
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)
До этого еще процесс не дошел. Тут только проблемы компилятора.
Да нет, тут именно те самые проблемы, до которых "еще процесс не дошел".
PM   Вверх
vnsk
Дата 26.7.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.7.2009

Репутация: нет
Всего: нет



2bsa
Спасибо за развернутый ответ.

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

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

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


PM MAIL   Вверх
bsa
Дата 27.7.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



vnsk, WinAPI - написан на Си. Любая программа на С++ под Windows явно или неявно использует WinAPI...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.