Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
 Аватар для peter_irich
368 / 224 / 53
Регистрация: 18.10.2017
Сообщений: 2,393

Не принимается #define

07.10.2025, 20:43. Показов 2132. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Я имею намерене написать небольшую программу для ARM, начал делать и попытался определить указатель на uint32_t:
C
1
2
3
4
5
6
7
8
#ifndef DEF__SOME_H
#define DEF_SOME_H 1
 
#include <stdint.h>
 
#define uint32_p (uint32_t *)
 
#endif
так оно не принимается, пише, что требуется нечто перед uint32_t - скобка, выражение или идентификатор,
а в чём причина? Если авно укзывать там, где надо, (uint32_t *), то это работает.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.10.2025, 20:43
Ответы с готовыми решениями:

Как реализовать директиву #define для создания шаблона отпределения #define ?
Здравствуйте уважаемые. При написании программы появилась необходимость задать шаблон создания...

std::cin, eof не всегда принимается как признак конца файла
std::string text; char ch = 0; while(!std::cin.get(ch).eof()){ text.append(1, ch); }...

Шифрование и обфускация принимается за вирус?
Дело вот в чем. Есть программа, при проверке которой онлайн антивирус и антивирус на компе...

29
Злостный нарушитель
 Аватар для Verevkin
10643 / 5794 / 1279
Регистрация: 12.03.2015
Сообщений: 26,744
07.10.2025, 21:07
Цитата Сообщение от peter_irich Посмотреть сообщение
так оно не принимается
У меня принимается. ЧЯДНТ?

0
 Аватар для peter_irich
368 / 224 / 53
Регистрация: 18.10.2017
Сообщений: 2,393
07.10.2025, 21:18  [ТС]
Verevkin, благодарю за проверку. Теперь буду искать, что Я делаю не так. Возможно, что-то не подключил.
0
Злостный нарушитель
 Аватар для Verevkin
10643 / 5794 / 1279
Регистрация: 12.03.2015
Сообщений: 26,744
07.10.2025, 21:20
Цитата Сообщение от peter_irich Посмотреть сообщение
благодарю за проверку.
Какого хрена ты не сделал такую проверку сам? Чо с тобой не так, чел?
Это же бесплатно и в тыщу раз быстрее форума.
0
 Аватар для peter_irich
368 / 224 / 53
Регистрация: 18.10.2017
Сообщений: 2,393
07.10.2025, 22:41  [ТС]
Verevkin, что значит "не сделал"? Я же сказал, что пытался это скомпилировать и оно не проходит, пишет, что перед uint32_t
требуетса '(' или идентификатор. Я пытаюсь скомпилировать в рамках arm-none-eabi, пока не получается именно с этим файликом.
Makefile есть, я уже явно подключил там
C_INCLUDES /usr/lib/include/newlib
но это не помогло.
0
Windows must die
678 / 862 / 103
Регистрация: 23.11.2021
Сообщений: 5,112
Записей в блоге: 18
08.10.2025, 00:30
Убери этот тупой ifndef в начале файла: ты проверяешь один макрос, а определяешь другой - толку от этого?
Вообще не нужно такой чушью заниматься, т.к. есть #pragma once - пишешь это в начале заголовочного файла, и он не будет повторно включаться.
Ну и дефайнить тип - тоже бред. Есть же typedef!!!
// я уж молчу о том, что вообще бессмысленно определять такой тип, как "указатель". Зачем?
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
08.10.2025, 06:48
peter_irich, алиас всяко лучше макроса. Кроме того, маскировать звёздочку под алиас тоже не стоит, больше проблем будет, чем пользы
0
 Аватар для peter_irich
368 / 224 / 53
Регистрация: 18.10.2017
Сообщений: 2,393
08.10.2025, 12:16  [ТС]
Благодарю за советы, ошибку в #ifndef в начале я вчера заметил и исправил.
#pragma вообще никогда в жизни не использовал и сейчас даже не знаю, что он делает.
С typedef тоже пробовал и с ним тоже не работает.
В определениях структур через typedef часто указывают и имя типа и имя указателя на него.
алиасы использовал только в .bashrc, так что опять же не представляю, как это делается в данном случае.
0
Модератор
Эксперт Java
 Аватар для alecss131
2881 / 1387 / 411
Регистрация: 11.08.2017
Сообщений: 4,427
Записей в блоге: 2
08.10.2025, 12:24
#pragma once хоть и поддерживается компиляторами, но вещь не стандартная для языка, можно наткнуться что не будет поддержки, так что использование на свой страх и риск.
C
1
typedef uint32_t* uint32_p;
И имхо лучше * от типа не стоит отрывать, что в typedef что в define писать uint32_t*, то есть без пробела
0
 Аватар для peter_irich
368 / 224 / 53
Регистрация: 18.10.2017
Сообщений: 2,393
08.10.2025, 13:36  [ТС]
alecss131, я пробовал #define и без пробела после uint_32_t. Сейчас вернусь к этоми и ещё раз проверю синтаксис.
0
Windows must die
678 / 862 / 103
Регистрация: 23.11.2021
Сообщений: 5,112
Записей в блоге: 18
08.10.2025, 14:39
Цитата Сообщение от alecss131 Посмотреть сообщение
не стандартная для языка
gcc и шланг понимают, а больше компиляторов и не существует!

Добавлено через 3 минуты
peter_irich, а почему у меня все работает и не ругается?
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdint.h>
 
typedef uint32_t* u32p;
 
int main(){
  uint32_t u = 0xdeadbeef;
  printf("value: 0x%X\n", u);
  u32p ptr = &u;
  printf("*ptr: 0x%X\n", *ptr);
  return 0;
}
Code
1
2
3
4
5
6
7
gcc 1.c -Wall -Werror && ./a.out 
value: 0xDEADBEEF
*ptr: 0xDEADBEEF
 
clang 1.c -Wall -Werror && ./a.out 
value: 0xDEADBEEF
*ptr: 0xDEADBEEF
Оба компилятора "съели" и ни разу не ругнулись!
0
 Аватар для peter_irich
368 / 224 / 53
Регистрация: 18.10.2017
Сообщений: 2,393
08.10.2025, 15:29  [ТС]
А не может ли такого быть, что у меня по умолчанию не включена какая-то опция комнпилятора, связанная с препроцессором?
0
 Аватар для Annemesski
2675 / 1336 / 481
Регистрация: 08.11.2016
Сообщений: 3,695
08.10.2025, 15:59
peter_irich, давайте сначала: приведите весь код который компилируете и дословно выхлоп компилятора.
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
08.10.2025, 17:12
Цитата Сообщение от Eddy_Em Посмотреть сообщение
больше компиляторов и не существует
наивный чукотский юноша

gcc вообще не показатель, там сплошные нестандартные расширения
1
 Аватар для peter_irich
368 / 224 / 53
Регистрация: 18.10.2017
Сообщений: 2,393
08.10.2025, 18:03  [ТС]
Я прикладываю два архива: work_gd.zip и work_gd-new.zip.
1-й без файла def_some.h, он компилируется без ошибок, в build/ появляются *.elf, *.bin и *.hex.
2-й с def_some.h, там в make.err полный вывод компилятора, в *.lst выдержки из этого файла.
cmpplf407 - это скрипт, запускающий компиляцию.Makefile был получен из работающего.

Наверное, я делаю какую-то элементарную ошибку.
Вложения
Тип файла: zip work_gd.zip (15.6 Кб, 4 просмотров)
Тип файла: zip work_gd-new.zip (15.3 Кб, 4 просмотров)
0
 Аватар для Annemesski
2675 / 1336 / 481
Регистрация: 08.11.2016
Сообщений: 3,695
08.10.2025, 18:33
peter_irich, уберите скобки в определении макроса, такой годится только для приведения типа, но не для объявления переменной
0
 Аватар для peter_irich
368 / 224 / 53
Регистрация: 18.10.2017
Сообщений: 2,393
08.10.2025, 20:32  [ТС]
Annemesski, так макросы бывают очень громоздкими, особеммо у тех, кому они нравятся. Вчера я смотрел макросы
системных файлах, там есть круглые скобки в правой части. И вообще круглыуе скобки в макросах - это обычное дело, но сейчас
попробую. Но я пробовал и без пробела перед '*', не помогло.
0
Windows must die
678 / 862 / 103
Регистрация: 23.11.2021
Сообщений: 5,112
Записей в блоге: 18
08.10.2025, 20:43
peter_irich, ты вообще понимаешь, что все, что ты пишешь после #define X будет вместо этого X вставляться?
И если ты пишешь #define uint32_p (uint32_t *), то при казалось бы обычном объявлении переменной uint32_p ptr ты получишь конструкцию (uint32_t *) ptr, что означает совсем другое - рассмотрение переменной ptr как указателя! А т.к. она у тебя не определена ранее, то компилятор естественно будет ругаться!
Этот случай как раз наглядно показывает, что не стоит в дефайнах вокруг всего, чего попало, скобки расставлять!

Добавлено через 2 минуты
Если тебе нужен макрос приведения чего-то к указателю (например, взять адрес переменной), то сделай как-нибудь так:
C
1
2
3
4
5
#define ADDR(X)  ((uint32_t*) X)
...
const char *name = "The name";
...
uint32_t *addrofname = ADDR(name);
0
 Аватар для peter_irich
368 / 224 / 53
Регистрация: 18.10.2017
Сообщений: 2,393
08.10.2025, 21:37  [ТС]
Eddy_Em, благодарю за пояснения, воообще я макросы не люблю и поэтому не слишком хорошо в них разбираюсь.
Однако мне удалось получить работающий вариант, причём работает как typedef, так и #define, как с пробелом перед '*', так и без него.
Но потребовалось из main.c убрать
Objective-C
1
#include "./init_dev.h"
т.к. были сообщения о мнокократном объявлении. Прилагаю архив с компилирующейся программой. Благодарю всех за помощь.
Вложения
Тип файла: zip work_gd-new.zip (16.2 Кб, 4 просмотров)
0
Windows must die
678 / 862 / 103
Регистрация: 23.11.2021
Сообщений: 5,112
Записей в блоге: 18
08.10.2025, 22:41
Цитата Сообщение от peter_irich Посмотреть сообщение
были сообщения о мнокократном объявлении
Косяк с макросом в header-guard, небось, забыл подправить?
Лучше пиши #pragma once в начале h-файлов, если не планируешь пользоваться нестандартными компиляторами.

Добавлено через 4 минуты
Глянул зачем-то в код! Ну страшно же! Отступы где? Неудобно читать ведь без отступов.
Дальше: зачем memcpy для копирования четырех байт данных? Вот, например:
C
1
2
3
memcpy((void *)&mreg,(void *)(src+sub_offs[8]),4);  //PA, AFSEL1
mreg|=0x000AAAAA;   //PA8-12, AF10
memcpy((void *)(src+sub_offs[8]),(void *)&mreg,4);
Сходу даже не поймешь, что это на самом деле:
C
1
src[sub_offs[8]] |= 0xAAAAA;
Это что ли попытка поупражняться в memcpy?

Кстати, подозреваю, что если глубже копнуть, то вышеописанная портянка на самом деле будет чем-то вроде REGISTER->FIELD |= FLAGS;.

Добавлено через 2 минуты
Вот, например, для STM32:
C
1
2
3
4
    GPIOA->AFR[0] = AFRf(2, 6) | AFRf(2, 7);
    GPIOA->AFR[1] = AFRf(14, 11) | AFRf(14, 12);
    GPIOA->MODER = MODER_AI(0) | MODER_AI(1)  | MODER_AI(4)  | MODER_AI(5)  | MODER_AF(6)  |
                   MODER_AF(7) | MODER_AF(11) | MODER_AF(12) | MODER_AF(13) | MODER_AF(14) | MODER_O(15);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2025, 22:41
Помогаю со студенческими работами здесь

Путь с пробелами не принимается. Не выводит список файлов в пути к которым пробелы(студия 2013, консоль)
Здравствуйте, товарищи! Помогите разобраться, пожалуйста. :) Программа не принимает путь, который...

Написать функцию, которая выводит на экран ряд чисел Фибоначчи до n. Число n принимается в качестве аргумента
Кто знает как решить задачу на С++, при помощи рекурсии? Написать функцию, которая выводит на...

Написать функцию, которая возвращает сумму n чисел Фибоначчи. Число n принимается в качестве аргумента
Кто знает, как решается задача на С++: написать функцию, которая возвращает сумму n чисел...

Символ } принимается регулярным выражением как буква-цифра
Символ } принимается регулярным выражением как буква-цифра. Регулярное выражение такое: regex...

Почему не принимается мое решение по алгоритму Soundex?
Почему Яндекс не принимает мое решение если он правильно все выводит Soundex Известный алгоритм...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru