Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
09.11.2010, 12:54     Не срабатывает #define #1
Почему не срабатывает #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;
}
};
 Комментарий модератора 
Используйте соответствующие теги форматирования кода.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2010, 12:54     Не срабатывает #define
Посмотрите здесь:

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

Добавлено через 20 минут
Я представлял так: препроцессор грузит файл Tennis.h и главный код а потом все LIM заменяет на 20
Если так то должно работать, а на самом деле как ?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.11.2010, 13:59     Не срабатывает #define #6
Lotles, представьте, что на месте строки
Цитата Сообщение от Lotles Посмотреть сообщение
#include "Tennis.h"
собственно содержимое Tennis.h, а сразу за ним
Цитата Сообщение от Lotles Посмотреть сообщение
#define LIM 20
то есть по всему тексту Tennis.h ни про какое LIM 20 и речи не идёт...
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
09.11.2010, 14:12  [ТС]     Не срабатывает #define #7
Так как вы объясняете не совсем понятно
Я общюю картину не пойму (Как препроцессор работает)
Допустим он загрузил .h не нашел там LIM(ошибки)
А потом отдельно главный файл(cpp), или препроцессор работает только с .h файлами ?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.11.2010, 14:33     Не срабатывает #define #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 перед объявлением функции...
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
09.11.2010, 14:46     Не срабатывает #define #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 по препроцессору был...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.11.2010, 14:51     Не срабатывает #define #10
Цитата Сообщение от Nameless One Посмотреть сообщение
Где-то на форуме faq по препроцессору был...
Почему "был"? Вот он, никуда не делся...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2010, 17:38     Не срабатывает #define
Еще ссылки по теме:

C++ #define
C++ c++11 и $define
C++ #define c ::

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

Или воспользуйтесь поиском по форуму:
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
09.11.2010, 17:38     Не срабатывает #define #11
Цитата Сообщение от Lotles Посмотреть сообщение
Так как вы объясняете не совсем понятно
Я общюю картину не пойму (Как препроцессор работает)
Допустим он загрузил .h не нашел там LIM(ошибки)
А потом отдельно главный файл(cpp), или препроцессор работает только с .h файлами ?
Компилятор работает только с главным файлом. А .h вызывается ровно в том месте, где в главном файле стоит соответствующая директива

Не по теме:

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

Yandex
Объявления
09.11.2010, 17:38     Не срабатывает #define
Ответ Создать тему
Опции темы

Текущее время: 02:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru