mkostoevr Незнайка 26 / 11 / 2 Регистрация: 14.10.2016 Сообщений: 373 Записей в блоге: 2 |
||||||||
1 |
||||||||
23.06.2017, 11:11. Показов 4605. Ответов 9 Метки нет (Все метки)
Здрасте! Короче, такое дело, я решил уменьшить размер своей программы таким образом: выделить все функции, которые в ней используются и подключить только те заголовки, в которых эти функции объявлены. Этот код:
Я заменил вот этим:
В результате MinGW выдал пот такой лист ошибок: C:/TDM-GCC-64/x86_64-w64-mingw32/include/minwinbase.h:14:5: error: ‘DWORD’ does not name a type В кратце говоря, он жалуется, что ему непонятны некоторые типы. Это можно как-нибудь исправить? Просто программа для своей функциональности уж слишком много весит, не хотелось бы всю коллекцию заголовков <Windows.h> в неё включать. Заранее спасибо!
0 |
Ушел с форума 16458 / 7422 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
23.06.2017, 11:18 |
2 |
Сообщение было отмечено mkostoevr как решение Решение
я решил уменьшить размер своей программы таким образом: выделить все функции, которые в ней используются и подключить только те заголовки, в которых эти функции объявлены. Включение заголовка <Windows.h> на размер программы не влияет. Никак.
1 |
Незнайка 26 / 11 / 2 Регистрация: 14.10.2016 Сообщений: 373 Записей в блоге: 2 |
|
23.06.2017, 11:20 [ТС] |
3 |
Убежденный, но Windows.h ссылается на другие заголовки, а, как мне сказали, заголовочные файлы компилятся вместе с программой в любом случае, даже если функции из них не были использованы. Разве не так?
0 |
Ушел с форума 16458 / 7422 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
23.06.2017, 11:23 |
4 |
Объявления типов, функций, интерфейсов и т.п. сами по себе ни во что не компилятся, пока Ну и во-вторых, подключая содержимое Windows.h избирательно, в обход стандартных путей,
0 |
Незнайка 26 / 11 / 2 Регистрация: 14.10.2016 Сообщений: 373 Записей в блоге: 2 |
|
23.06.2017, 11:27 [ТС] |
5 |
Убежденный, понятно… Но теперь двойне странно, почему программа на MinGW весит в 4 раза больше аналогичной на Visual Studio…
0 |
Software Developer 315 / 229 / 113 Регистрация: 03.05.2017 Сообщений: 1,322 |
|
23.06.2017, 11:30 |
6 |
mkostoevr, попробуйте использовать strip.exe входящую в состав MinGW
0 |
Незнайка 26 / 11 / 2 Регистрация: 14.10.2016 Сообщений: 373 Записей в блоге: 2 |
|
23.06.2017, 11:33 [ТС] |
7 |
decrement, программа с самого начла компилится с параметром -s, так что никаких символов в ней нет изначально, strip, скорее всего, не поможет.
0 |
Ушел с форума 16458 / 7422 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
23.06.2017, 11:50 |
8 |
Но теперь двойне странно, почему программа на MinGW весит в 4 раза больше аналогичной на Visual Studio… Не вижу ничего странного. Вот было бы действительно странно, если бы MinGW или MS C/C++ Compiler
1 |
183 / 181 / 66 Регистрация: 15.02.2015 Сообщений: 515 |
|
23.06.2017, 14:54 |
9 |
почему программа на MinGW весит в 4 раза больше аналогичной на Visual Studio… Хоть компиляторы и разные, а такая разница в размере скорее всего из-за того, что по умолчанию MSVC++ компилирует с флагом /md (Multithreded Dll), и программа динамически линкуется с рантайм библиотекой. Exe’шник становится легче, но, как я упомянул, есть зависимость от библиотеки Visual Studio конкретной версии.
0 |
Незнайка 26 / 11 / 2 Регистрация: 14.10.2016 Сообщений: 373 Записей в блоге: 2 |
|
23.06.2017, 15:25 [ТС] |
10 |
Operok, в том то и прикол, что эту функцию я отключил в настройках проекта.
0 |
I was trying to compile a software package, While compiling I am getting this error
sha.cpp:29: error: ‘word64’ does not name a type
I went through the source code.The relevant portion is
#if HAVE64
word64 bytes;
#else
word32 bytesHi, bytesLo;
#endif
from sha.cpp, Line No 29-33
And I found that word64 was declared in the following way in another file
#include <limits.h>
#ifdef __cplusplus
extern "C" {
#endif
#if UCHAR_MAX == 0xff
typedef unsigned char byte;
typedef signed char int8;
#else
#error This machine has no 8-bit type
#endif
#if UINT_MAX == 0xffff
typedef uint word16;
typedef int int16;
#elif USHRT_MAX == 0xffff
typedef unsigned short word16;
typedef short int16;
#else
#error This machine has no 16-bit type
#endif
#if UINT_MAX == 0xfffffffful
typedef uint word32;
typedef int int32;
#elif ULONG_MAX == 0xfffffffful
typedef ulong word32;
typedef long int32;
#else
#error This machine has no 32-bit type
#endif
#if ULONG_MAX > 0xfffffffful
#if ULONG_MAX == 0xfffffffffffffffful
typedef ulong bnword64;
#define BNWORD64 bnword64
#define HAVE64 1
#endif
#endif
#ifndef HAVE64
#if defined(ULONG_LONG_MAX) || defined (ULLONG_MAX) || defined(ULONGLONG_MAX)
typedef unsigned long long word64;
typedef long long int64;
#define HAVE64 1
#endif
#endif
And my system is
Linux EmbeddedLinux 2.6.32-431.1.2.el6.x86_64 #1 SMP Sun Nov 24 09:37:37 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
The compiler I am using to compile
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
I browsed internet to get this thing fixed, but did not find any clue.
Any help will be appreciated
In C++, one of the most common errors that programmers encounter is the “does not name a type” error. The error usually occurs when the programmer writes a piece of code in which the compiler is not able to recognize the type or definition for it.
In this article, we are going to explore the “does not name a type” error in C++ in detail, including the causes of the error, and some coded examples which can trigger the error along with its solutions.
Causes of the Error
The root causes of this error are the syntactical mistakes that happen due to the use of incorrect syntax. This error can occur when the programmer uses an undefined class member, undeclared class pointer, and incorrectly defined variables. Here are some reasons in detail as to why this error can occur:
- C++ uses header files to define classes, structs, and different data types. You can encounter the error if you do not include header files while writing the program. The compiler will not recognize the associated types and generate the “does not name a type” error.
- Syntax errors in your code can easily generate this error as the compiler will misinterpret the intended type names. Let’s have a detailed look at some of the reasons which can trigger this error.
Some of the more common causes of the given error are as follows:
1. Using a datatype that has not been defined yet
A class or struct must be defined before it is used in C++. If the user tries to use the undefined data type “Day” to declare the data member, then the compiler will generate the stated error.
C++
#include <iostream>
using
namespace
std;
class
MyClass {
public
:
Day Morning;
};
Output
/tmp/PIU8LcSCJx.cpp:8:5: error: 'Day' does not name a type 8 | Day Morning; | ^~~
In the above code, the compiler will generate the error because we have used the “Day” class which is not defined.
2. Circular dependencies between classes
When the definitions of 2 classes depend on each other and one of them is not defined then it can lead to circular dependency between them which can generate the “does not name a type error”. A coded example of the error would be:
C++
#include <iostream>
using
namespace
std;
class
ClassA {
public
:
ClassB obj;
};
class
ClassB {
public
:
ClassA obj;
};
int
main() {
return
0;
}
Output
/tmp/PIU8LcSCJx.cpp:6:5: error: 'ClassB' does not name a type; did you mean 'ClassA'? 6 | ClassB obj; | ^~~~~~ | ClassA
In the above code, ClassB depends on ClassA which is not defined completely, and thus, the compiler will produce an error of “does not name a type” for you.
3. Wrong initialization of variables
A variable declaration should be done inside a function or else you are sure to get an error. For example, we create a struct and then declare two variables inside them and do not initialize them. Later in the code, we initialize the same variables outside the function body. The compiler will generate a “variable does not name a type error”. Let’s look at the code to understand what we are trying to say.
C++
#include <iostream>
using
namespace
std;
struct
games{
int
Football;
int
Cricket;
int
VolleyBall;
};
games activeGames;
activeGames.Football=5;
activeGames.Cricket=11;
activeGames.VolleyBall=6;
int
main() {
return
0;
}
Output
/tmp/PIU8LcSCJx.cpp:11:1: error: 'activeGames' does not name a type 11 | activeGames.Football=5; | ^~~~~~~~~~~ /tmp/PIU8LcSCJx.cpp:12:1: error: 'activeGames' does not name a type 12 | activeGames.Cricket=11; | ^~~~~~~~~~~ /tmp/PIU8LcSCJx.cpp:13:1: error: 'activeGames' does not name a type 13 | activeGames.VolleyBall=6; | ^~~~~~~~~~~
4. Not following the Syntax
Overall, all the causes are cases when there is a mistake in the syntax of the program. Writing incorrect syntaxes like misplacing semicolons, curly brackets, and function calls before the main() function. The user can also face this error if he does not have a basic understanding of the difference between various operators and uses incorrect datatypes.
The C++ error can be solved if the user is careful with the class definitions, define the variables properly, and adhere to the syntax of the language. Let’s look at the detailed solutions for this particular type of error.
Solutions of the “does not name a type” Error in C
We should take care of the following points to avoid the “does not name a type error” in C.
1. Defining the Datatype before using it
As we have seen, if you do not define a class or a struct and then later try to use it, the compiler will throw the “does not name a type error”. It is better to define the datatype you are using in the program.
2. Removing Circular Dependency between Classes
In the circular dependency case, we should use the forward declaration of the classes. This will help in avoiding the error by telling the compiler that the class with the given name has its definition present somewhere in the program.
3. Defining Variables while declaring Them
You should define the variables while declaring them as it is considered a good coding practice and prevents these types of errors. Let’s look at the correct code to solve this issue.
4. Following the Syntax Correctly
It is the ultimate solution to the problem which removes the root of this error. The user should double-check the syntax and ensure the following points while checking their code:
- All the statements end with a semicolon.
- Ensure that all the code stays within the curly braces.
- Removing function calls before the main() function.
- Specifying correct datatypes for the variables.
Conclusion
The “does not name a type” error in C++ usually pops up when the compiler is unable to understand your program. The problem could be a variable or a function and can be caused by a variety of factors, such as missing header files, typos in writing variables, or circular dependencies between classes. It is very important to carefully review the code and check for any missing include statements. The error can be solved by understanding the root causes of the “does not name a type” error.
If you are a C++ developer, you might have come across the error ‘Does not name a type’ at some point in your programming journey. This error can be frustrating and can make your code fail to compile. In this guide, we will look at the causes of this error and provide you with tips and solutions to resolve it.
What Causes the Error ‘Does Not Name a Type’?
The error ‘Does not name a type’ occurs when the compiler encounters an unknown type. This can happen if you have not declared a class or a struct, or if you have misspelled the name of the type. The error can also occur if you have not included the necessary header files or if the header files are not in the correct location.
Tips to Resolve the Error ‘Does Not Name a Type’
Here are some tips that can help you resolve the error ‘Does not name a type’:
Check for Typing Errors: One of the most common causes of this error is a typing mistake. Double-check the spelling of the type you are trying to use in your code.
Declare the Type: If you have not declared the type, declare it using the ‘class’ or ‘struct’ keyword. For example, if you are trying to use a class called ‘Person’, you can declare it as follows:
class Person {
// Class definition here
};
Include the Header File: If you have declared the type in a header file, make sure you include the header file in your code. For example, if your header file is called ‘person.h’, you can include it as follows:
#include "person.h"
Check the Header File Location: Make sure the header file is in the correct location. If the header file is in a different directory than your code file, you may need to specify the path to the header file.
Use Forward Declarations: If you don’t want to include the entire header file, you can use forward declarations. A forward declaration tells the compiler that a class or struct exists without providing the full definition. For example, if you have a class called ‘Person’ and you want to use it in another class called ‘Employee’, you can forward declare it as follows:
class Person;
class Employee {
// Class definition here
};
FAQ
What is the Error ‘Does Not Name a Type’?
The error ‘Does not name a type’ occurs when the compiler encounters an unknown type.
What Causes the Error ‘Does Not Name a Type’?
The error can be caused by a typing mistake, a missing declaration, a missing header file, or a header file in the wrong location.
How Can I Resolve the Error ‘Does Not Name a Type’?
You can resolve the error by checking for typing errors, declaring the type, including the header file, checking the header file location, or using forward declarations.
What is a Forward Declaration?
A forward declaration tells the compiler that a class or struct exists without providing the full definition.
Yes, you can use forward declarations instead of including header files if you don’t want to include the entire header file.
Conclusion
The error ‘Does not name a type’ can be frustrating, but it is easily resolvable. By following the tips provided in this guide, you can quickly identify the cause of the error and resolve it. Remember to double-check for typing errors, declare the type, include the header file, check the header file location, or use forward declarations. Happy coding!
- C++ Programming Language
- Stack Overflow
Здравствуйте. Первый раз сталкиваюсь с ардуино. Остановился на такой же ошибке:
‘LEDdata’ does not name a type; did you mean ‘mData’?
Всё, что выше писали делаю, ошибка не уходит.
Точнее, микролед версия 3.4, а версии 2.3 нет на гитхабе
/*
Скетч к проекту «Наливатор by AlexGyver»
— Страница проекта (схемы, описания): https://alexgyver.ru/GyverDrink/
— Исходники на GitHub: https://github.com/AlexGyver/GyverDrink/
Проблемы с загрузкой? Читай гайд для новичков: https://alexgyver.ru/arduino-first/
Нравится, как написан код? Поддержи автора! https://alexgyver.ru/support_alex/
Автор: AlexGyver, AlexGyver Technologies, 2019
https://www.youtube.com/c/alexgyvershow
https://github.com/AlexGyver
https://AlexGyver.ru/
[email protected]
*/
/*
Версия 1.1:
— Поправлена работа системы при выборе некорректного объёма
— Исправлены ошибки при наливании больших объёмов
— Исправлен баг с остановкой наливания при убирании другой рюмки
Версия 1.2:
— Исправлено ограничение выбора объёма
— Исправлены ошибки (обновите библиотеки из архива! servoSmooth v1.8, microLED v2.3)
— Добавлено хранение в памяти выбранного объёма
Версия 1.3:
— Исправлен баг со снятием рюмки в авто режиме (жука поймал Юрий Соколов)
Версия 1.4:
— Добавлена настройка уровня концевиков (для ИК датчиков)
— Исправлена ошибка с наливанием больших объёмов
Версия 1.5:
— Добавлена инверсия сервопривода (ОБНОВИТЕ БИБЛИОТЕКУ ИЗ АРХИВА)
*/
// ======== НАСТРОЙКИ ========
#define NUM_SHOTS 4 // количество рюмок (оно же кол-во светодиодов и кнопок!)
#define TIMEOUT_OFF 5 // таймаут на выключение (перестаёт дёргать привод), минут
#define SWITCH_LEVEL 0 // кнопки 1 — высокий сигнал при замыкании, 0 — низкий
#define INVERSE_SERVO 0 // инвертировать направление вращения серво
// положение серво над центрами рюмок
const byte shotPos[] = {25, 60, 95, 145, 60, 60};
// время заполнения 50 мл
const long time50ml = 5500;
#define KEEP_POWER 1 // 1 — система поддержания питания ПБ, чтобы он не спал
// отладка
#define DEBUG_UART 1
// =========== ПИНЫ ===========
#define PUMP_POWER 3
#define SERVO_POWER 4
#define SERVO_PIN 5
#define LED_PIN 6
#define BTN_PIN 7
#define ENC_SW 8
#define ENC_DT 9
#define ENC_CLK 10
#define DISP_DIO 11
#define DISP_CLK 12
const byte SW_pins[] = {A0, A1, A2, A3, A4, A5};
// =========== ЛИБЫ ===========
#include <GyverTM1637.h>
#include <ServoSmooth.h>
#include <microLED.h>
#include <EEPROM.h>
#include «encUniversalMinim.h»
#include «buttonMinim.h»
#include «timer2Minim.h»
// =========== ДАТА ===========
#define COLOR_DEBTH 2 // цветовая глубина: 1, 2, 3 (в байтах)
LEDdata leds[NUM_SHOTS]; // буфер ленты типа LEDdata (размер зависит от COLOR_DEBTH)
microLED strip(leds, NUM_SHOTS, LED_PIN); // объект лента
GyverTM1637 disp(DISP_CLK, DISP_DIO);
// пин clk, пин dt, пин sw, направление (0/1), тип (0/1)
encMinim enc(ENC_CLK, ENC_DT, ENC_SW, 1, 1);
ServoSmooth servo;
buttonMinim btn(BTN_PIN);
buttonMinim encBtn(ENC_SW);
timerMinim LEDtimer(100);
timerMinim FLOWdebounce(20);
timerMinim FLOWtimer(2000);
timerMinim WAITtimer(400);
timerMinim TIMEOUTtimer(15000); // таймаут дёргания приводом
timerMinim POWEROFFtimer(TIMEOUT_OFF * 60000L);
bool LEDchanged = false;
bool pumping = false;
int8_t curPumping = -1;
enum {NO_GLASS, EMPTY, IN_PROCESS, READY} shotStates[NUM_SHOTS];
enum {SEARCH, MOVING, WAIT, PUMPING} systemState;
bool workMode = false; // 0 manual, 1 auto
int thisVolume = 50;
bool systemON = false;
bool timeoutState = false;
bool volumeChanged = false;
bool parking = false;
// =========== МАКРО ===========
#define servoON() digitalWrite(SERVO_POWER, 1)
#define servoOFF() digitalWrite(SERVO_POWER, 0)
#define pumpON() digitalWrite(PUMP_POWER, 1)
#define pumpOFF() digitalWrite(PUMP_POWER, 0)
#if (DEBUG_UART == 1)
#define DEBUG(x) Serial.println(x)
#else
#define DEBUG(x)
#endif