С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
#1

Не срабатывает #define - C++

09.11.2010, 12:54. Просмотров 755. Ответов 10
Метки нет (Все метки)

Почему не срабатывает #define и как исправить ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"
#include "conio.h"
#include "Tennis.h"
#define LIM 20
using namespace std;
int main(){
    TableTennisPlayer player1("Chuck","Blizzard",true);
    TableTennisPlayer player2("Tara", "Boomdea", false);
    player1.Name();
    if (player1.HasTable())
        cout << ": has a table.\n";
    else
        cout << ":hasn't a table.\n";
    player2.Name();
    if (player2.HasTable())
        cout << ": has a table";
    else
        cout << ":hasn't a table.\n";
    return 0;
}
Tennis.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"
#include "conio.h"
using namespace std;
class TableTennisPlayer{
private:
    char firstname[LIM];
    char lastname[LIM];
    bool hasTable;
public:
TableTennisPlayer(const char* fn, const char* ln, bool ht){
    strncpy(firstname, fn, LIM-1);
    firstname[LIM-1]='\0';
    strncpy(lastname, ln, LIM-1);
    lastname[LIM-1]='\0';
    hasTable=ht;
}
void Name() const{
    cout << lastname << ", " << firstname;
}
bool HasTable() const{
    return hasTable;
}
void ResetTable(bool v){
    hasTable=v;
}
};
 Комментарий модератора 
Используйте соответствующие теги форматирования кода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2010, 12:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не срабатывает #define (C++):

#define не срабатывает? - C++
Здравствуйте, вот такая программа для вычисления по формуле (1-tg x)^(ctg x)+ cos(x-y). В общем внизу указано 2 вывода ответа, один через...

#define c :: - C++
Подскажите как реализовать такую замену: #define sa2::sys::getClientKernel()-&gt;getXDBTManager() cls_SimpleXDBTManager::Instance() ...

define - C++
И еще такой вопрос для чего служит #define ??

#define - C++
#define зачем нужна это заголовочный файл какие у него функции и как им ползоватса?

c++11 и $define - C++
Есть код который прекрасно компилируется без -std=c++11, но как только я включаю эту опцию то константы препроцессора не заменяются и...

define - C++
Всем здрасьте , что означает эта строчка? #define MAX(a,b) a&gt;b? a:b

10
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
09.11.2010, 13:01 #2
Lotles, Гм. объявить
C
1
#define LIM 20
в хедер файле тоже.
Или в главном ПЕРЕД включением файла Tennis.h (хотя насчет этого не уверен)
1
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
09.11.2010, 13:11 #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Гм. объявить
C
1
#define LIM 20
в хедер файле тоже.
не "тоже", а только там и объявлять!
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
09.11.2010, 13:11 #4
easybudda, Чорт.Да. Не всматривался в код главного файла. Совсем невнимательный с утра...
0
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
09.11.2010, 13:56  [ТС] #5
А почему так происходит(как компилятор обрабатывает в первом(неправильном случае))

Добавлено через 20 минут
Я представлял так: препроцессор грузит файл Tennis.h и главный код а потом все LIM заменяет на 20
Если так то должно работать, а на самом деле как ?
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
09.11.2010, 13:59 #6
Lotles, представьте, что на месте строки
Цитата Сообщение от Lotles Посмотреть сообщение
#include "Tennis.h"
собственно содержимое Tennis.h, а сразу за ним
Цитата Сообщение от Lotles Посмотреть сообщение
#define LIM 20
то есть по всему тексту Tennis.h ни про какое LIM 20 и речи не идёт...
0
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
09.11.2010, 14:12  [ТС] #7
Так как вы объясняете не совсем понятно
Я общюю картину не пойму (Как препроцессор работает)
Допустим он загрузил .h не нашел там LIM(ошибки)
А потом отдельно главный файл(cpp), или препроцессор работает только с .h файлами ?
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
09.11.2010, 14:33 #8
Цитата Сообщение от Lotles Посмотреть сообщение
Так как вы объясняете не совсем понятно
Да уж не знаю, куда понятнее... Попробуйте скомпилировать вот это
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
void prn(void){
    int i;
    for ( i = 0; i < LIMIT; ++i )
        printf("%d ", i);
    printf("\n");
}
 
#define LIMIT 10
 
int main(void){
    prn();
    return 0;
}
а когда ничего не выйдет, перенесите строку с #define перед объявлением функции...
1
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
09.11.2010, 14:46 #9
Препроцессор, когда встречает директиву #include, производит подстановку файла, указанного в директиве, в данное место в программе (где встретилась директива). С #define все происходит так - препроцессор производит подстановку тела макроса везде, где встречается идентификатор, объявленный #define. Но подстановка происходит только ниже объявления макроса:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Здесь макрос не объявлен, поэтому писать что-то типа такого:
// int i = FOO; -- бессмысленно
 
// Объявляем макрос
#define FOO 42
 
// Вот теперь  везде (НИЖЕ строчки с объявлением макроса)
// препроцессор заменит FOO в исходном коде на 42
// причем еще до непосредсвенной компиляции
int i = FOO;
int arr[FOO];
 
// А можно "отменить" определение макроса:
#undef FOO
 
// Теперь при использования идентификатора FOO 
// получаем ошибку:
// int j = i - FOO; -- ошибка
ЗЫ. Где-то на форуме faq по препроцессору был...
1
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
09.11.2010, 14:51 #10
Цитата Сообщение от Nameless One Посмотреть сообщение
Где-то на форуме faq по препроцессору был...
Почему "был"? Вот он, никуда не делся...
0
Black Fregat
1395 / 1026 / 231
Регистрация: 31.05.2009
Сообщений: 4,276
09.11.2010, 17:38 #11
Цитата Сообщение от Lotles Посмотреть сообщение
Так как вы объясняете не совсем понятно
Я общюю картину не пойму (Как препроцессор работает)
Допустим он загрузил .h не нашел там LIM(ошибки)
А потом отдельно главный файл(cpp), или препроцессор работает только с .h файлами ?
Компилятор работает только с главным файлом. А .h вызывается ровно в том месте, где в главном файле стоит соответствующая директива

Не по теме:

(за исключением творения умников из MS, которое мистическим образом подтягивает stdafx.h к каждому файлу в проекте)

0
09.11.2010, 17:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2010, 17:38
Привет! Вот еще темы с ответами:

define не - C++
Здравствуйте. &quot;Дефайню&quot; &quot;%f&quot; для вывода: #define fss &quot;%f&quot;; . И потом делаю вывод вот такой вот: for(i=0;i&lt;n;i++) fscanf(in,fss,&amp;a-&gt;di);. И...

#define - C++
Здравствуйте, дорогие программисты! сразу хочу сказать, что в С++ я совсем недавно, поэтому толком ничего не знаю Во-первых,...

Const #define - C++
{ const int HOLFSDsize= 2;//#define HOLFSDsize 2 // m-угольник void HOLFSD() { int i, n, l; // объявляем...

inline и define - C++
Почему использовать inline-функции лучше, чем использовать команду препроцессора #define? Смысл в том, что лучше лишний раз не трогать...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.