Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/120: Рейтинг темы: голосов - 120, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 07.09.2019
Сообщений: 18
1

Использование stdafx.h

07.09.2019, 09:39. Показов 24340. Ответов 33

Добрый день (вечер). Я учусь на первом курсе. Мы начали изучать Си, а потому нам дали учебник по этому языку, а также сказали скачать Visual Studio 2010. Скачав его и немного на нем поработав, я понял, что запутался. По ряду причин (которые я сейчас назову) я перестал понимать на каком из языков (Си или C++) я пишу.
Первая причина: директива #include <stdio.h>. В учебнике по Си именно она используется для объявления стандартных ввода-вывода. Однако в Visual Studio на место неё встает #include "stdafx.h", которая, к слову, и вызывает stdio.h. Но если не использовать #include "stdafx.h", просто написать как в учебнике (#include <stdio.h>), то компилятор начинает ругаться. Например, вот эта программа
C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
  int main()
  {
      int a,b,sum; /* Описание трех целых переменных a,b,sum */
      printf("\nВведите два целых числа: "); /* Вывод сообщения об ожидаемом вводе */
      scanf("%d %d",&a,&b); /* Ввод значений переменных a,b */
      um=a+b; /* Оператор присваивания: сложить a и b; результат - в sum */
      printf("a+b=%d\n",sum); /* Вывод результата - значения переменной sum */
      return 0;
  }
попросту не работает в VS и работает в онлайн компиляторе Си.
Вторая причина: Большинство операторов и синтаксических конструкций являются командами языка Си, а не C++(например printf() и scanf() вместо cin и cout, а также %d)
По этим и некоторым другим причинам(например, формат файлов .cpp, что указывает на C++) я и запутался языках. Помогите, разъясните.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2019, 09:39
Ответы с готовыми решениями:

stdafx.h и StdAfx.h
Добавил в свое решение проект (win32, lib). Добавил класс. У меня создался cpp-файл каркас с...

файлы stdafx
Здравствуйте, форумчане! Подскажите, пожалуйста, зачем нужны файлы stdafx? почему в начале...

Подключение stdafx.h
Здравствуйте! Помогите , пожалуйста, разобраться с проблемой! Без подключения библиотеки...

iostream, StdAfx.h
Начал изучать С++ попытался набрать первый листинг и посмотреть программу в работе и тут же...

33
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
07.09.2019, 09:44 2
Цитата Сообщение от Atemyn Посмотреть сообщение
Но если не использовать #include "stdafx.h", просто написать как в учебнике (#include <stdio.h>), то компилятор начинает ругаться. Например, вот эта программа
Не парься. Просто поставь этот stdafx.h в начале и всё
C++
1
2
3
#include "stdafx.h"
#include <stdio.h>
int main()
Либо отключи в свойствах проекта precompiled header
0
357 / 224 / 120
Регистрация: 25.06.2019
Сообщений: 828
07.09.2019, 09:45 3
Цитата Сообщение от Atemyn Посмотреть сообщение
Но если не использовать #include "stdafx.h"
Создать "Пустой проект", к нему Исходный код/Добавить существующий Нечто.с, в него и копипастить учебник
0
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
07.09.2019, 09:47 4
Цитата Сообщение от Atemyn Посмотреть сообщение
Вторая причина: Большинство операторов и синтаксических конструкций являются командами языка Си, а не C++(например printf() и scanf() вместо cin и cout, а также %d)
По этим и некоторым другим причинам(например, формат файлов .cpp, что указывает на C++) я и запутался языках. Помогите, разъясните.
с++ поддерживает все конструкции языка си. Спокойно можешь вызывать prinft, scanf и т.д.
0
Эксперт C
25959 / 16171 / 3470
Регистрация: 24.12.2010
Сообщений: 35,379
07.09.2019, 09:59 5
Цитата Сообщение от Atemyn Посмотреть сообщение
Вторая причина:
Язык Си является подмножеством языка С++. (За некоторыми небольшими исключениями, на которые пока вы можете не обращать внимания). Поэтому в программе на С++ вы спокойно можете пользоваться функциями printf, scanf. И даже вперемешку с cout, cin (что не рекомендуется)

Добавлено через 3 минуты
Цитата Сообщение от Atemyn Посмотреть сообщение
например, формат файлов .cpp, что указывает на C++
Ты можешь дать своему файлу имя с расширением .cpp и не использовать в нем ни одного оператора, специфичного для C++, то есть написать его на чистом Си. Тебя поймут.
1
С чаем беда...
Эксперт CЭксперт С++
9074 / 4606 / 1250
Регистрация: 18.10.2014
Сообщений: 10,306
07.09.2019, 10:07 6
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
с++ поддерживает все конструкции языка си. Спокойно можешь вызывать prinft, scanf и т.д.
Язык С++ не "поддерживает все конструкции языка си". Язык С ни в коем случае не является "подмножеством языка С++". Поэтому смешивать эти языки ни в коем случае нельзя.

Добавлено через 2 минуты
Цитата Сообщение от Atemyn Посмотреть сообщение
Первая причина: директива #include <stdio.h>. В учебнике по Си именно она используется для объявления стандартных ввода-вывода. Однако в Visual Studio на место неё встает #include "stdafx.h", которая, к слову, и вызывает stdio.h. Но если не использовать #include "stdafx.h", просто написать как в учебнике (#include <stdio.h>), то компилятор начинает ругаться.
В настройках нового проекта Visual Studio вы запросили использование прекомпилированных заголовков через посредство заголовка stdafx.h. В этом и заключается причина этого странного поведения и странного статуса stdafx.h. Именно поэтому компилятор Visual Studio требует включения stdafx.h во все файлы реализации и выдает ошибку, если такого включения не сделано.

Выключите использование прекомпилированных заголовков в настройках вашего проекта и все придет в норму. Включать в ваши файлы stdafx.h станет не нужно.
2
Эксперт C
25959 / 16171 / 3470
Регистрация: 24.12.2010
Сообщений: 35,379
07.09.2019, 10:20 7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Язык С++ не "поддерживает все конструкции языка си".
Может быть вы приведете пример простой конструкции, подтверждающий ваши слова?
Я, конечно, не имею в виду сомнительние нововведения типа
C
1
2
3
4
5
6
int n;
scanf("%d", &n);
{
  int a[n];
  ....
}
1
С чаем беда...
Эксперт CЭксперт С++
9074 / 4606 / 1250
Регистрация: 18.10.2014
Сообщений: 10,306
07.09.2019, 10:50 8
Цитата Сообщение от Байт Посмотреть сообщение
Может быть вы приведете пример простой конструкции, подтверждающий ваши слова?
Я могу сразу навскидку привести более десятка примеров простых конструкций из эры "классического" С - никаких "нововведений" не нужно.

Элементарный пример я приводил совсем недавно

C
1
2
3
4
inf main(void)
{
  char s[3] = "abc";
}
Еще

C
1
extern void x;
Еще

C
1
const const const int a = 42;
Еще

C
1
2
/* На уровне файла */
int a, a, a;
Еще

C
1
2
struct S s;
struct S { int i; };
И это еще только тривиальщина...
0
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
07.09.2019, 10:52 9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И это еще только тривиальщина...
Я специально коллекционирую эти ситуации здесь:
Ну и коллекционировал бы. Здесь-то зачем ты эту всё это выкатил?
0
С чаем беда...
Эксперт CЭксперт С++
9074 / 4606 / 1250
Регистрация: 18.10.2014
Сообщений: 10,306
07.09.2019, 11:01 10

Не по теме:

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну и коллекционировал бы. Здесь-то зачем ты эту всё это выкатил?
Не понял. (Удивленно переглянемся всем форумом.) Будем считать, что участник oleg-m1973, как говорится, "ляпнул не подумав". Я уверен, что он очень извиняется и больше так не будет.



Ссылка, которая так понравилась данному оратору вела сюда: https://ru. stackoverflow.com/a/789069/182825 Я ее удалил из исходного сообщения потому, что в исходной форме она была слишком громоздкой. Привожу более компактный вариант
0
Эксперт С++
8402 / 4078 / 891
Регистрация: 15.11.2014
Сообщений: 9,168
07.09.2019, 11:55 11
Цитата Сообщение от Atemyn Посмотреть сообщение
если не использовать #include "stdafx.h", просто написать как в учебнике (#include <stdio.h>), то компилятор начинает ругаться.
не слушай тех идиотов,
которые предлагают отключить предварительно скомпилированный заголовок.

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

и особенно не слушай тех идиотов, которые утверждают, что:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
компилятор Visual Studio требует включения stdafx.h во все файлы реализации
так могут написать только те,
кто не умеет правильно готовить это блюдо.

на самом деле, нужно лишь указать имя stdafx.h,
в свойстве Force Include File, как на скриншоте:
Использование stdafx.h


обрати внимание: All Configurations, All Platforms

после чего компилятор сам догадается,
где, когда, и как нужно подключать stdafx.h

тебе вручную в коде писать #include "stdafx.h" не нужно.
0
hoggy
07.09.2019, 11:56
  #12

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
(Удивленно переглянемся всем форумом.)
ты себя всем форумом возомнил?
у тебя шиза шталь?

0
Эксперт C
25959 / 16171 / 3470
Регистрация: 24.12.2010
Сообщений: 35,379
07.09.2019, 12:06 13
Странно. Код
C++
1
  char s[3] = "abc";
Несмотря на свою явную ошибочность, никаких возражений у транслятора не вызвал.
0
Эксперт С++
8402 / 4078 / 891
Регистрация: 15.11.2014
Сообщений: 9,168
07.09.2019, 12:29 14
Цитата Сообщение от Байт Посмотреть сообщение
Несмотря на свою явную ошибочность, никаких возражений у транслятора не вызвал.
https://rextester.com/TIID34976

Код
source_file.cpp: In function ‘int main()’:
source_file.cpp:4:17: error: initializer-string for array of chars is too long [-fpermissive]
     char s[3] = "abc";
                 ^
0
Эксперт C
25959 / 16171 / 3470
Регистрация: 24.12.2010
Сообщений: 35,379
07.09.2019, 13:33 15
Цитата Сообщение от hoggy Посмотреть сообщение
source_file.cpp: In function ‘int main()’:
source_file.cpp:4:17: error: initializer-string for array of chars is too long [-fpermissive]
char s[3] = "abc";
Имхо, это разница не языков, а трансляторов. Ваш - умненький, эту грубую ошибку ловит, мой - дурачок, пропустил.
Но мое глубокое убеждение - для ТС выгоднее все-таки считать Си подмножеством С++. Хотя бы, чтобы распутаться со стартовыми вопросами.
0
С чаем беда...
Эксперт CЭксперт С++
9074 / 4606 / 1250
Регистрация: 18.10.2014
Сообщений: 10,306
07.09.2019, 17:18 16
Цитата Сообщение от Байт Посмотреть сообщение
Странно. Код
C++
1
  char s[3] = "abc";
Несмотря на свою явную ошибочность, никаких возражений у транслятора не вызвал.
Во-первых, у какого транслятора? Код является корректным в С и ошибочным в С++.

Во-вторых, никакой "явной ошибочности" у этого кода нет - он реализует вполне конкретную и вполне корректную функциональность. Устаревшую, но когда-то считавшуюся ценной и нужной в С. Функция strncpy - еще одна грань этой же функциональности.

Цитата Сообщение от Байт
Имхо, это разница не языков, а трансляторов. Ваш - умненький, эту грубую ошибку ловит, мой - дурачок, пропустил.
В-третьих, нет, конечно. Это именно разница языков, и никакого "имхо" тут нет. И да, "странно", язык С внезапно не является подмножеством языка С++...
0
Azazel-San
07.09.2019, 17:49
  #17

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Поэтому смешивать эти языки ни в коем случае нельзя.
Хотел спросить что именно имеется в виду под данным предлогом?
Это понятно что смешивать нельзя, но мне интересно как глубоко уходит это понятие?
Например, под не смешивать мы понимаем конструкции которые разрешены в С и не разрешены или приводят к UB в С++ и vice versa, как вы показывали, но касается ли это использования Сишных ф-й, printf, scanf, fgets, etc. ведь иногда бывает, что без них прям туго, если я не хочу использовать стандартные стримы?
Чисто интересно ваше мнение.

0
TheCalligrapher
07.09.2019, 17:54
  #18

Не по теме:

Цитата Сообщение от Azazel-San Посмотреть сообщение
но касается ли это использования Сишных ф-й, printf, scanf, fgets, etc. ведь иногда бывает, что без них прям туго, если я не хочу использовать стандартные стримы?
Нет, конечно, не касается. Используйте на здоровье. В моем сообщении речь шла о чисто формальной "неподмножественности" С. Никаких стилистических "ценных указаний" я никому давать не собирался.

0
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,414
Записей в блоге: 1
07.09.2019, 18:01 19

Не по теме:

ух ты, а тут весело


Не по теме:

Цитата Сообщение от Azazel-San Посмотреть сообщение
Чисто интересно ваше мнение.
а мое интересно?

0
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,414
Записей в блоге: 1
07.09.2019, 18:05 20
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Язык С ни в коем случае не является "подмножеством языка С++".
ты подумал по ходу что Байт имел ввиду математическое понятие подмножества
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2019, 18:05

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Не найден файл stdafx.h
#include &lt;iostream&gt; using namespace std; int main() { int i=0; while(i++&lt;10){ ...

Ошибка подключения stdafx.h
скажите пожалуйста как исправит эту ошибку Сообщения и тексты программ надо копировать в текст...

stdafx.h: No such file or directory
Как убрать ошибку? stdafx.h: No such file or directory.

Ошибка stdafx в Dev C++
Not such file in derectory. Без stdafx код не работает, но дев выдает ошибку

Ошибка stdafx.h: No such file or directory
при запуске программы выдает такую ошибку : fatal error C1083: Не удается открыть файл включение:...

Fatal error: stdafx.h: No such file or directory
Не понимаю в чем ошибка? сам код #include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.