Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2

Ошибка: переопределение; различные базовые типы

23.11.2025, 10:55. Показов 2179. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу победить ошибку.
Code
1
Ошибка    C2371   _MemFindRev: переопределение; различные базовые типы
Данная функция не вызывает ошибки при компиляции в x86 (Visual Studio), однако при опытке собрать свою dll-ку в x64 вылезла эта ошибка. Вот код функцийи
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
INT_PTR MemFindRev(void* pcWhere, int szWhere, void* pcWhat, int szWhat) {
    return _MemFindRev((char*)pcWhere, szWhere, (char*)pcWhat, szWhat);
}
__inline INT_PTR _MemFindRev(char* pcWhere, int szWhere, char* pcWhat, int szWhat) {
    char* pcWhere1 = pcWhere;
    char cWhat1 = *pcWhat;
    char* pcWhat2 = pcWhat + 1;
    char* pEndWhat = pcWhat + szWhat;
    for (pcWhere = pcWhere1 + szWhere - szWhat; pcWhere >= pcWhere1; pcWhere--) {
        if (*pcWhere != cWhat1) {}
        else {
            char* pcWhere_ = pcWhere + 1;
            for (pcWhat = pcWhat2; pcWhat < pEndWhat; pcWhat++, pcWhere_++) {
                if (*pcWhere_ == *pcWhat) {}
                else goto skip;
            }
            return (INT_PTR)pcWhere;
        }
    skip:;
    }
    return NULL;
}
В x64 различия конечно есть между значениями int (32 бита) и указателями (64 бита), однако, смена типа int на INT_PTR не решает проблемму.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2025, 10:55
Ответы с готовыми решениями:

Ошибка C2371 int32_t: переопределение; различные базовые типы
Здравствуйте. Я перешёл на MVS 2015 и при открытии проекта у меня выдаёт следующие ошибки: Скрин...

Переопределение; различные базовые типы
#include &lt;stdio.h&gt; #include &lt;math.h&gt; void main() { int x = 0; scanf(&quot;Введите диапазон: %i&quot;,...

Функция: переопределение; различные базовые типы
При написании консольной игры выдаёт ошибку(в скриншоте). Не могу понять в чем проблема. ...

26
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,316
23.11.2025, 15:44
Студворк — интернет-сервис помощи студентам
.... отдельная тема - это цикл вида

C
1
    for (pcWhere = pcWhere1 + szWhere - szWhat; pcWhere >= pcWhere1; pcWhere--)
А есть гарантия, что указатель pcWhere разрешается уменьшать до тех пор, пока он не станет меньше pcWhere1? Если pcWhere1 указывает на самое начало некоего массива, то такой цикл - неопределенное поведение.
0
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2
23.11.2025, 16:28  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
??? В приведенном вами коде открытым текстом видно, что это функция.
Но это inline-функция, которая должна разворачиваться в код, врводе как.
В общем проблемма решилась добавлением 2 строчек
C
1
2
static __inline LONG_PTR MemFindRevW_(WCHAR* pcWhere, int lnWhere, WCHAR* pcWhat, int lnWhat);
static __inline LONG_PTR MemFindRev_(char* pcWhere, int lnWhere, char* pcWhat, int lnWhat);
Всем большое спасибо за проявленное внимание к теме!

Добавлено через 6 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А есть гарантия, что указатель pcWhere разрешается уменьшать до тех пор, пока он не станет меньше pcWhere1?
Не понял вопроса, есть ведь условие >= pcWhere1, дошли до pcWhere1 (т.е. до начала массива) дальше цикл не пойдет. Вообще эта функция не безопасная, она предназначена только для встраивания, а все проверки происходят во "внешней" функции/коде.

Добавлено через 27 минут
Цитата Сообщение от alecss131 Посмотреть сообщение
Просто указать компилятору более новый стандарт языка, по умолчанию в студии ANSI C (C89), вроде в С11 и С17 такое
У меня C14 по умолчанию, сейчас включил C17, спасибо за информацию

Добавлено через 43 секунды
С++17 точнее
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
23.11.2025, 16:31
Цитата Сообщение от testuser2 Посмотреть сообщение
Но это inline-функция, которая должна разворачиваться в код, врводе как.
Не должна, а только может.

В любом случае правила определения функций от этого никак не меняются.
1
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2
23.11.2025, 17:14  [ТС]
Из наблюдений. Сия оказия, по видимому, касается не всех возвращаемых типов, а, в данном случае, "голых" целочисленных. А вот функции, возвращающие BSTR и VARIANT_BOOL (алиас short) не понадобилось объявлять и при этом они прекрасно работают. Т.о. с.п.в. для данного типа проекта (ATL-библитека) это какой-то индивидуальный случай.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,316
23.11.2025, 20:06
Цитата Сообщение от testuser2 Посмотреть сообщение
Но это inline-функция, которая должна разворачиваться в код, врводе как.
Inline-функция никому ничего не должна. Ключевое слово inline служит лишь для того, чтобы определение функции можно было поместить в заголовочный файл и не получить при этом ошибок линкера о "множественном определении".

Семантика функции от inline не меняется - функция остается функцией и ни в какой "макрос" не превращается.

Цитата Сообщение от testuser2 Посмотреть сообщение
Не понял вопроса, есть ведь условие >= pcWhere1, дошли до pcWhere1 (т.е. до начала массива) дальше цикл не пойдет.
Ну так для того, чтобы это условие НЕ выполнилось (то есть чтобы цикл завершился), нужно чтобы стало < pcWhere1. А это - потенциальное неопределённое поведение.

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
У меня C14 по умолчанию, сейчас включил C17, спасибо за информацию
С++17 точнее
Не понял. О каком "С++17 точнее" может идти речь, если программа написана на С?
0
Модератор
Эксперт Java
 Аватар для alecss131
2895 / 1401 / 412
Регистрация: 11.08.2017
Сообщений: 4,488
Записей в блоге: 2
23.11.2025, 21:16
Цитата Сообщение от testuser2 Посмотреть сообщение
У меня C14 по умолчанию, сейчас включил C17, спасибо за информацию
Добавлено через 43 секунды
С++17 точнее
С и С++ два разных языка, стандарты у них тоже разные и для каждого языка в проекте задается свой стандарт. Язык выбирается исходя из расширения файла, .с это Си, а .срр/.схх это С++
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
24.11.2025, 00:15
Цитата Сообщение от testuser2 Посмотреть сообщение
Из наблюдений. Сия оказия, по видимому, касается не всех возвращаемых типов, а, в данном случае, "голых" целочисленных. А вот функции, возвращающие BSTR и VARIANT_BOOL (алиас short) не понадобилось объявлять и при этом они прекрасно работают.
Скорее всего они просто изначально находились выше точки вызова.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2025, 00:15

ПЕРЕМЕННЫЕ И БАЗОВЫЕ ТИПЫ ДАННЫХ ЯЗЫКА ПРОГРАММИРОВАНИЯ С
Задание 1 1. Выполните ввод данных (включая числовые) с помощью функции scanf_s(). В частности,...

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

Что из себя представляют базовые средства языка?
в билете к экзамену есть такой вопрос....про что здесь нужно отвечать??:help:?

Базовые операции обработки двумерных массивов
Разработать программу формирования и вывода двумерного массива размерности (N, M). В программе...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru