Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
-24 / 3 / 1
Регистрация: 05.02.2013
Сообщений: 51

Большие странности при переименовании *.cpp => *.c

10.10.2019, 15:03. Показов 1769. Ответов 16

Студворк — интернет-сервис помощи студентам
Здравствуйте.
У меня есть знакомый (не правда ли, многие беседы в кабинете психоаналитика начинаются так же?)
которого на учёбе мучают языком C (иначе это назвать нельзя).
В результате когда я пытаюсь сделать его домашку у себя на компе,
я вынужден писать ( в IDE VS 2019 ) всё в c-style, и переименовывать *.cpp файл в *.c

И есть такая проблема.

Вот я открываю шаблон консольног о проекта.
Чуть чуть исправляю его, чтобы он соответствоввал учебной прогрмамме.
Получаю проект (файл main.cpp) следующего вида:

C++
1
2
3
4
5
6
#include <stdio.h>
 
int main()
{
    printf("Hi, evil world\r\n");
}
(студия вставляет туда еще некоторые комментарии, но это сейчас совершенно не важно)

потом я добавляю одну строчку - объявление (даже не оперделение) функции:

C++
1
2
3
4
5
6
7
8
#include <stdio.h>
 
void tmpFunction(int& n);
 
int main()
{
    printf("Hi, evil world\r\n");
}
Всё прекрасно. Всё компилируется и работает.

Затем я переименовываю файл (просто закрываю в студии tab с файлом, кликаю мышкой в solution explorer на этот файл и редактирую его название c main.cpp на main.c)

Заметьте - в файле ни одного символа не поменялось!

И в этот момент проект перестаёт компилироваться СТУДИЕЙ и вообще она находит в файле пять ошибок, начиная с

Code
1
"Error (active) E0018   expected a ')'  main    C:\MyProjects\Conly\main\main.c 6"
Естественно, консольная команда
Code
1
g++ main.c
компилирует всё без проблем.

Еще одно наблюдение:
если строка с объявлением функции будет без "передачи аргумента по ссылке" , то есть
Code
1
void tmpFunction(int n);
- то ничего не сломается.

Не может ли кто то объяснить, что Студия такого не понимает в *.c файлах, и как ей правильно дать по рукам?
Может, есть какая то специальная магическая настройка студии, чтобы она могла работать с *.c файлами?

Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2019, 15:03
Ответы с готовыми решениями:

Спящий режим большие странности
Ребята такие странности происходить начали. Пользовался спящим режимом и ничего не менял, компьютер начал сам выходить из спящего режима,...

Баг при переименовании формы
Последовательность действий: Переименовать форму, нажав Ctrl+R,R на имени класса в редакторе кода. В меню, которое появляется возле...

Ошибка при переименовании пользователя
Здравствуйте, коллеги! :D Поменял недавно сотруднице фамилию Rename-ом. Все везде обновилось, кроме айдишки.. как была в айдишке...

16
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.10.2019, 15:30
SteeLHeaD, специально в стандарт залез:
Цитата Сообщение от N1256 5.1.2.2.1
Program startup
The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
C
1
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):
C
1
int main(int argc, char *argv[]) { /* ... */ }
or equivalent; or in some other implementation-defined manner.
0
-24 / 3 / 1
Регистрация: 05.02.2013
Сообщений: 51
10.10.2019, 15:36  [ТС]
Спасибо, что Вы заглянули в стандарт.
К сожалению, это не имеет отношения к проблеме, о которой я написал.
Более того, в "настоящей" программе, на которой я столкнулся с проблемой - мой main был описан именно так как в стандарте.
И ноль на массу.
всё равно студия начинает беситься, если переименовать *.cpp в *.c.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.10.2019, 15:37
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
мой main был описан именно так как в стандарте
тем временем:
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
C
1
int main()
Цитата Сообщение от Azazel-San Посмотреть сообщение
It shall be defined with a return type of int and with no
parameters:
Цитата Сообщение от Azazel-San Посмотреть сообщение
C
1
int main(void)
Найдите 1 отличие.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.10.2019, 15:47
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
Не может ли кто то объяснить, что Студия такого не понимает в *.c файлах
студия считает, что .cpp - это исходник языка с++,
а .c - исходник языка си

ведь это прямиком проистекает из расширений файлов.

соответственно, для компиляции .cpp запускается компилятор языка с++
соответственно, для компиляции .c запускается компилятор языка с

нет ничего удивительного в том,
что компилятор языка си не может скомпилировать код языка с++

например эта строчка:
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
void tmpFunction(int& n);
вообще не валидная с точки зрения языка си.
ведь в языке си нет никаких ссылок.

Цитата Сообщение от SteeLHeaD Посмотреть сообщение
как ей правильно дать по рукам?
проблема не в студии.
проблема в прокладке между стулом и монитором.
1
-24 / 3 / 1
Регистрация: 05.02.2013
Сообщений: 51
10.10.2019, 15:50  [ТС]
Я прошу прощения, возможно, я не совсем правильно объяснил проблему...
Моя проблема не связана с правильностью написания функции main().
Она связана с тем, что "как ты ни пиши функцию мейн, хоть как в стандарте, хоть как в темплейте студии - всё равно при переименовании файла студия находит непонятные ошибки в корректной программе, (которая нормально собирается из командной строки). Поэтому, наверное, моя проблема связана не с языком, а с настройкой студии".

А чтобы продемонстрировать проблему - я прилагаю две картинки, на которых
1) не первой картинке - файл имеет расширени cpp, и всё хорошо. (и в файле используется main(int argc, char *argv[]))
2) на второй картинке - файл имеет расширение с, и в файле находятся ошибки.

Возможно так же, что я не понял что в Вашем объяснении.
Но я попробовал и варинат с функцией void main (void) {} - и не заметил, что это на что то влияет.
Миниатюры
Большие странности при переименовании *.cpp => *.c   Большие странности при переименовании *.cpp => *.c  
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.10.2019, 15:54
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
C
1
void main (void) {}
Так писать нельзя.
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
а второй картинке - файл имеет расширение с, и в файле находятся ошибки.

Ну, вы же сами написали:
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
ще одно наблюдение:
если строка с объявлением функции будет без "передачи аргумента по ссылке" , то есть
C
1
void tmpFunction(int n);
- то ничего не сломается.
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
на второй картинке
на второй картинке студия вам специально подсветила символ &.

В Си нету ссылок, неужели все так запущено, я уж думал вы загуглили.
1
-24 / 3 / 1
Регистрация: 05.02.2013
Сообщений: 51
10.10.2019, 15:58  [ТС]
Спасибо.

Я, правда, первый раз слышу о том, что в языке C (без плюсов) нет никакиз ссылок.

А как в языке С устроена передача аргументов по ссылке?
Может, есть какое то простое введение в тему?

Просто обычный поиск приводит к руководствам по языку с++ (котрый с плюсами), а мне только что популярно объяснили, что это две большие разницы.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.10.2019, 16:01
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
А как в языке С устроена передача аргументов по ссылке?
Никак. Сказано же нет в Си ссылок.
Передачу без копирования можно сделать (как и в С++) через указатель.
C
1
2
3
4
void tmpFunction(int* n);
...
int n = 10;
tmpFunction(&n);
Кстати для С++ обычно ссылки в компиляторах реализованы по средствам указателей.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
10.10.2019, 16:02
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
А как в языке С устроена передача аргументов по ссылке?
Она там отсутствует как таковая. Вместо неё используется только передача указателей не переменные.

Цитата Сообщение от SteeLHeaD Посмотреть сообщение
Просто обычный поиск приводит к руководствам по языку с++
И? Если решился писать код на языке С, то ищи в разделе https://www.cyberforum.ru/c/ . Если нужен С++, будь добр, сохраняй расширение cpp.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
10.10.2019, 16:04
Цитата Сообщение от Azazel-San Посмотреть сообщение
специально в стандарт залез:
я бы тоже туда залез, если бы знал где
0
-24 / 3 / 1
Регистрация: 05.02.2013
Сообщений: 51
10.10.2019, 16:05  [ТС]
ну, еще раз спасибо!
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
10.10.2019, 16:06
Цитата Сообщение от Azazel-San Посмотреть сообщение
Кстати для С++ обычно ссылки в компиляторах реализованы по средствам указателей.
да ладно, типо както там с паметью работают?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.10.2019, 16:11
Цитата Сообщение от SteeLHeaD Посмотреть сообщение
Я, правда, первый раз слышу о том, что в языке C (без плюсов) нет никакиз ссылок.
А как в языке С устроена передача аргументов по ссылке?
в языке си нет никаких ссылок.
значит передавать аргументы по ссылкам там нельзя.
потому что невозможно передать что-то по ссылке,
которой не существует.

Цитата Сообщение от SteeLHeaD Посмотреть сообщение
Может, есть какое то простое введение в тему?
хочешь кушать суп - возьми ложку.
не нужно брать вилку, и потом спрашивать на форумах:
как сделать, что б из вилки вода не утекала.

отсюда закономерный вопрос: нафига ты переименовал .cpp в .c ?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.10.2019, 16:15
SteeLHeaD, в дополнение к вышесказанному:

в Си функция main должна иметь return statement, в С++ необязательно (не смотря на указание возвращаемого значения int).

g++ - всегда обращается к компилятору С++, независимо от расширения. Соответственно ваша программа им всегда компилировалась как программа С++, поэтому это работало.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
10.10.2019, 16:26
SteeLHeaD, ну сказали же: компилятор Си не понимает ссылок, поэтому строка
C
1
void tmpFunction(int& n);
для него ошибочна!

Добавлено через 3 минуты

Не по теме:

Ого! сколько наотвечали, пока немного отвлекся... Ну ничего, повторение - мать учения...

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
10.10.2019, 19:19
Цитата Сообщение от DrOffset Посмотреть сообщение
в Си функция main должна иметь return statement,
В старом стандарте C89/90 было так. Начиная с С99 return statement в main не обязателен.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.10.2019, 19:19
Помогаю со студенческими работами здесь

Глюк при переименовании страницы
непонятная ситуация. если по умолчанию оставляю название web проекта, например WebApplication1, WebForm1.aspx, etc то при обращении по...

Проблемы при переименовании форм в GUI
Такая проблема. Есть главня GUI форма и есть второстепенная. Переход с главной к второстепенной и обратно есть. m-фаилы созданы...

Удаляются файлы при переименовании папки
Добрый вечер. Пытаюсь переименовать папку, в которой есть файлы. rename('uploads/images/cars', 'supercars'); Папку оно...

при переименовании стер расширение док
Здравствуйте!!! При переименовании вордовского документа стер расширение .doc. Теперь при открытии документа выдает окно...

При переименовании файла вылазит ошибка
При переименовании файла вылазит ошибка &quot;после смены расширения имени файла этот файл может оказаться недоступным&quot; Как это...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru