Страница 299 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 12:04:58
Allex
Не адреса, а значения.
Я правда хочу разобраться.
Код: Выделить всё
void SwapInt16Values(int16_t& pValue1, int16_t& pValue2)
Не означает ли эта запись, что внутри функции мы работаем с адресами переменных?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 12:12:57
WiseLord
Это (в C++) означает, что переменная передана по ссылке. То есть, любые изменения её внутри функции изменяют оригинальную переменную извне. Внутри функции (с точки зрения синтаксиса) с этими переменными работать нужно ровно так же, как если бы они были переданы просто по значению.
P.S.
Спойлер
Код: Выделить всё
#include <iostream>
using namespace std;
void swap_c_style(int a, int b)
{
int r = a;
a = b;
b = r;
}
void swap_c_pointer_style (int *a, int *b)
{
int r = *a;
*a = *b;
*b = r;
}
void swap_cpp_style(int &a, int &b)
{
int r = a;
a = b;
b = r;
}
int main()
{
int x, y;
x = 2; y = 3;
swap_c_style(x, y);
cout << "x: " << x << ", y: " << y << endl;
x = 2; y = 3;
swap_c_pointer_style(&x, &y);
cout << "x: " << x << ", y: " << y << endl;
x = 2; y = 3;
swap_cpp_style(x, y);
cout << "x: " << x << ", y: " << y << endl;
return 0;
}
Вывод:
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 12:20:25
Аlex
[uquote="Allex",url="/forum/viewtopic.php?p=3616962#p3616962"]Не означает ли эта запись, что внутри функции мы работаем с адресами переменных?[/uquote]
Означает. Мы передаём константные адреса переменных, по которым работаем с самими переменными внутри функции.
Единственные, на мой взгляд, отличия от указателей - синтаксис и константность.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 14:31:04
FeCat
Как создать и подключить .h и .с файлы? Как правильно?
Создаю timer8.c с реализацие функции, и создаю timer8.h с обьявлением функции. Кидаю в одну папку с main.cpp файлом.
В main в начале пишу:
Код: Выделить всё
#include "timer8.h"
Timer0Init(); // Timer0Init - обьявлен в timer8.h, и реализован в timer8.c
while(1)
{
}
В timer8.h обьявляю:
Код: Выделить всё
#ifndef __timer8_h__
#define __timer8_h__
void Timer0Init(void);
#endif
В timer8.c пишу:
Код: Выделить всё
void Timer0Init(void)
{
реализация Timer0Init
}
Как итог "undefined reference to `Timer0Init()'". Если в .h файле добавить "#include "timer8.c"" то ошибки нет. Но это же идеологически не правильно.
Пишу в AtmelStudio7.
Как правильно делать?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 14:34:13
ARV
правильно:
1. не делать проекты без необходимости с исходниками одновременно С++ и С
2. добавлять исходники в проект средствами IDE
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 14:40:32
Аlex
FeCat писал(а):Кидаю в одну папку с main.cpp файлом.
1. Этого, наверное, мало. Нужно добавить исполняемый файл в проект.
2. Объявление в .cpp-файлах внешних функций, находящихся в .c-файлах нужно делать через обрамление в extern "C"{}
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 15:27:44
FeCat
[uquote="Аlex",url="/forum/viewtopic.php?p=3617081#p3617081"]Нужно добавить исполняемый файл в проект.[/uquote]
[uquote="ARV",url="/forum/viewtopic.php?p=3617076#p3617076"]добавлять исходники в проект средствами IDE[/uquote]
Т.е. это нормально-правильно, что если в майне есть инклюд .h файла, то .cpp автоматом к нему не подтягивается? Надо обязательно средствами IDE добавлять, а не из main или добавленных к main файлов. Далать "#include "timer8.cpp"" - вроде как не правильно?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 15:29:30
Аlex
FeCat писал(а):Т.е. это нормально-правильно, что если в майне есть инклюд .h файла, то .cpp автоматом к нему не подтягивается?
Да, нормально.
В любой IDE нужно добавлять ручками исходные файлы в проект.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 15:37:53
VladislavS
Есть IDE, которые всё подряд из папки компилят, но это как-то нефеншуйно.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 15:45:53
OKF
Отнюдь. Только не всё подряд, а определённые типы файлов. Вон FeCat-у именно так и хотелось бы.)
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 16:07:18
FeCat
Я правильно понимаю, что если появилась необходимость подключить к проекту "C++" файлы "C", то делаем так:
extern "C"{
#include "timer8.h"
};
Файл timer8.c добавится в проект "C++"(через IDE) как "C".
Аналогично можно делать вставки кода не на языке "файла".
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 16:09:50
Аlex
[uquote="FeCat",url="/forum/viewtopic.php?p=3617127#p3617127"]Файл timer8.c добавится в проект "C++"(через IDE) как "C".[/uquote]Не добавится он в проект. Его нужно самому добавлять, ручками. Чтобы он отображался в дереве проекта.
Как это делается конкретно в вашем IDE - не в курсе. Погуглите.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 16:30:25
da-nie
В любой IDE нужно добавлять ручками исходные файлы в проект.
Нет... Есть IDE, которые сканируют каталог и всё, что там найдено считают файлами проекта и подвергают компиляции. Типичный пример - IDE Momentics в QNX 6.3 (на базе Eclipse вроде она).
Есть IDE, которые всё подряд из папки компилят, но это как-то нефеншуйно.
Но, кстати, очень удобно. В отличие от Visual Studio с логическими папками (которые ещё создать надо ручками), проектом очень просто управлять - создал папки и скопировал файлы и попросил пересканировать.
А вот есть всякие Keil, которые сами чего-то там из CMSIS и HAL компилируют из исходников, но в проекте этих файлов исходников не отображается (или я не в курсе, как его заставить их показать). Вот это неудобно.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 16:34:55
Аlex
Удобство - дело сугубо индивидуальное. Вам удобно - другим нет...
В любом случае, нужно сделать так, чтобы файлы появились в дереве проекта. А каким образом это сделать - зависит от конкретной IDE.
Просто подкинуть файлы в папку, в большинстве случаев, не достаточно. По этому - гуглим...
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 18:22:56
WiseLord
Тупо подключать и компилировать все .c файлы из каталога - плохая идея. Компилятору следут передавать только нужные файлы.
Почему - ответ простой. Если у меня в проекте поддерживается, например, 20 разных контроллеров дисплея, а собираю я под какой-то конкретный, то компилировать 19 ненужных файлов нет смысла.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 15, 2019 18:57:41
ARV
da-nie писал(а):на базе Eclipse вроде она
да, Eclipse CDT по умолчанию именно так и делает: всё, что в папке проекта, считает компилируемыми файлами. однако, легко можно исключить любой файл и даже папку целиком из этого списка.
WiseLord писал(а):Если у меня в проекте поддерживается, например, 20 разных контроллеров дисплея, а собираю я под какой-то конкретный, то компилировать 19 ненужных файлов нет смысла
как правило, в IDE это решается при помощи конфигурации разных target-ов, и в упомянутой мною Eclipse именно так.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт апр 16, 2019 09:14:48
ПростоНуб
[uquote="FeCat",url="/forum/viewtopic.php?p=3617127#p3617127"]то делаем так:
extern "C"{
#include "timer8.h"
};[/uquote]
Наоборот, удобней в любой заголовочный файл C в начало поставить
, а в конец:
WiseLord писал(а):Тупо подключать и компилировать все .c файлы из каталога - плохая идея.
По разному бывает. Я часто настраиваю makefile именно таким образом. А вот все условно включаемое размещаю в соответствующих поддиректориях, нередко даже с симлинками. Тогда настройка на конкретную сборку вызывает подключение еще одной или нескольких поддиректорий (или конкретных файлов).
В сложных сборках, когда этих самых исходных файлов десяток видов, а людей, работающих над проектом не мало, удобней минимально трогать общий makefile.
С/С++ иходники еще ничего. А вот когда ворох мелких ресурсных файлов, причем взаимосвязанных, задолбаешься постоянно makefile мержить.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт апр 16, 2019 16:24:02
Psych
[uquote="FeCat",url="/forum/viewtopic.php?p=3617072#p3617072"]Если в .h файле добавить "#include "timer8.c"" то ошибки нет. Но это же идеологически не правильно.
Пишу в AtmelStudio7.
Как правильно делать?[/uquote]
Надо в cи файле написать #Include "timer8.h"
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср апр 17, 2019 06:48:03
FeCat
Огромное спасибо ответившим. Вроде в голове прояснилось.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт апр 19, 2019 23:54:26
arkhnchul
[uquote="WiseLord",url="/forum/viewtopic.php?p=3617201#p3617201"]Тупо подключать и компилировать все .c файлы из каталога - плохая идея.[/uquote]на самом деле, это очень удобно - заметно упрощается makefile и вообще управление проектом. Не хочешь, чтобы файл компилировался - просто не клади его в этот каталог
