powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как лучше сделать: #ifdef
8 сообщений из 33, страница 2 из 2
Как лучше сделать: #ifdef
    #39615428
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинЧто будет на месте этих функций в третьем файле
user3.c, который не включает #include "fun.h"?
Останутся как были?
Что значит не включает? Чтобы вызвать функцию, нужно иметь ее прототип.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615435
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин

Что будет на месте этих функций в третьем файле
user3.c, который не включает #include "fun.h"?
Останутся как были?

Ошибка компиляции.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615491
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересный эффект
сделал такой тест


Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
#include "stdafx.h"
#include "TestClass1.h"

#ifndef DoLog
	#define DoLog(...) DoDoLog(__VA_ARGS__)
#endif

#define DOCALL 2

#if defined(DOCALL) && DOCALL > 1
	#define DoLog2(...) DoDoLog2(__VA_ARGS__)
#else
	#define DoLog2(...) 
#endif

void DoDoLog(char* s, int level, int flags);
void DoDoLog2(char* s, int level, int flags);

int main()
{
	DoLog("main: started", 0, 11);
	TestClass1* t = new TestClass1();
	if (t)
	{
		DoLog2("main: TestClass1 created", 1, 101);
		t->RunTest();
	}
	else
	{
		DoLog2("main: TestClass1 NOT created", 2, 201);
	}

	printf("Enter any key...");
	DoLog("main: Exit", 0, 101);
	getchar();
    return 0;
}

void DoDoLog(char* s, int level, int flags)
{
	Logger *log = new Logger();
	log->DoLog(s, level);
}
void DoDoLog2(char* s, int level, int flags)
{
	Logger *log = new Logger();
	char msgstr[1024];
	sprintf(msgstr,"DoDoLog2: %s",s);
	log->DoLog(msgstr, level);
}


///...

#include "stdafx.h"
#include "Logger.h"


Logger::Logger()
{
}


Logger::~Logger()
{
}

void Logger::DoLog(char* msg, int nLevel)
{
	printf("DoLog(%d): %s\n", nLevel, msg);
}




пишет ошибку, т.е. в лоб заменяет:

Код: plaintext
1.
2.
Severity	Code	Description	Project	File	Line	Suppression State
Error	C2039	'DoDoLog': is not a member of 'Logger'	TestConApp1	d:\_samples\pg\testconapp1\testconapp1\testconapp1.cpp	
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615497
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинв лоб заменяет:
Это же макросы. Они не понимают С/С++ - они работают просто с лексемами.
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615607
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyРолг ХупинВ этом *.c файле она не будет вызываться, т.е. вместо нее будет заглушка, а в других будет?
Зачем заглушка. Можно вообще ничего не подставлять.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
// fun.h
#if defined(DOCALL)
#define DoCall(...) RealDoCall(__VA_ARGS__)
#else
#define DoCall(...) 
#endif

#if defined(DOCALL) && DOCALL > 1
#define DoCall2(...) RealDoCall2(__VA_ARGS__)
#else
#define DoCall2(...) 
#endif

// user.c
#include "fun.h"
...

DoCall(1,2,3);
DoCall2(1,2,3);



По поводу ничего не подставлять, что будет если вот так и без заглушки?

Код: plaintext
1.
2.
3.
4.
5.
printf("Begin");
for(int i=0; i<N; i++)
   DoCall2(s, 5, 105);// <-----------

printf("End");
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615617
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинчто будет если вот так и без заглушки?

Попробуй и узнаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615618
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинПо поводу ничего не подставлять, что будет если вот так и без заглушки?

Код: plaintext
1.
2.
3.
4.
5.
printf("Begin");
for(int i=0; i<N; i++)
   DoCall2(s, 5, 105);// <-----------

printf("End");


Будет

Код: plaintext
1.
2.
3.
4.
printf("Begin");
for(int i=0; i<N; i++)
   ;// <-----------
printf("End");


... что и требовалось.
";" - это валидный пустой оператор в С/С++
...
Рейтинг: 0 / 0
Как лучше сделать: #ifdef
    #39615757
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Хотел использовать вторую константу, но подумал, что можно эту же, но со значением.
Константа определяется в строке компилятора.
Как проверять значение в таком случае?


Код: plaintext
1.
2.
3.
#if DOCALL == 1
#elif DOCALL == 2
#endif



http://en.cppreference.com/w/cpp/preprocessor/conditional
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как лучше сделать: #ifdef
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]