Объясните, пожалуйста, сакральный смысл #define

yolki

вот тут:

enum
{
FTW_F, /* Regular file. */
#define FTW_F FTW_F
FTW_D, /* Directory. */
#define FTW_D FTW_D
FTW_DNR, /* Unreadable directory. */
#define FTW_DNR FTW_DNR
FTW_NS, /* Unstatable file. */
#define FTW_NS FTW_NS

#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED

FTW_SL, /* Symbolic link. */
# define FTW_SL FTW_SL
#endif

#ifdef __USE_XOPEN_EXTENDED
/* These flags are only passed from the `nftw' function. */
FTW_DP, /* Directory, all subdirs have been visited. */
# define FTW_DP FTW_DP
FTW_SLN /* Symbolic link naming non-existing file. */
# define FTW_SLN FTW_SLN

#endif /* extended X/Open */
};

:confused:

Marinavo_0507

наверное, чтоб можно было потом #ifdef использовать

bleyman

Ыыыы.
Может быть чтобы если кто случайно задефайнит что-нибудь из списка, он получил ошибку компиляции?

yolki

для этого есть

#ifndef _FTW_H
#define _FTW_H 1

вариант более правдоподобен, однако отдаёт какой-то параноидальностью
почему бы тогда так не защитить всю библиотеку, начиная с printf, и т.п.
например, есть очевидный косяк - если в программе есть функция "abort" или "exit", то полученный exe-шник (a.out) не работоспособен

Marinavo_0507

для этого есть
нет, не для этого

yolki

возможно...
есть какие-то причины сделать флаги енумом, а не дефайном сразу, типа как тут?

/* The possibilities for the third argument to `fseek'.
These values should not be changed. */
#define SEEK_SET 0 /* Seek from beginning of file. */
#define SEEK_CUR 1 /* Seek from current position. */
#define SEEK_END 2 /* Seek from end of file. */

ppplva

А в истории коммитов нет ничего? Обычно такие вещи объясняют, если конечно не пофигисты писали.

Marinavo_0507

это наверное придумали в каком-нибудь 1975, когда не было такого слова - коммит
может быть, чтобы пространство имён не сильно загрязнять?
ну то есть локальную переменную можно назвать таким же именем, и всё ок
то, что я ща в гугле нашёл на эту тему, в основном про это

rosali

я думаю по началу был старый код в Си-стиле, через define-ы. потом его решили заапгрейдить, переписали на enum-ы. но это нарушает обратную совместимость, у людей перестает работать код в котором ifdef-ы на эти define-ы. поэтому рядом с enum-ами оставили define-ы.
PS. enum-ы круче define-ов например потому что можно вот так клёво оверлодить
 
[xoft c++]$ cat enum.cpp
#include <iostream>
using namespace std;

enum X {
X1 = 10,
X2 = 20,
};

ostream & operator << (ostream & os, const X & x) {
if (x == X1) {
os << "X1";
} else if (x == X2) {
os << "X2";
} else {
os << "X" << int(x);
}
return os;
}

int main {
cout << X1 << " " << X(5) << endl;
}

[xoft c++]$ ./enum
X1 X5

Papazyan

Unix has you

bleyman

Я, кстати, согласен с Гадфазером наверное. Обратите внимание — там часть значений сама обёрнута в ifdef. Ну и наверное правильнее проверять, допустимо ли некое значение непосредственно, чем через определяющее его наличие условие или ещё как-то.

Ivan8209

> есть какие-то причины сделать флаги енумом, а не дефайном сразу, типа как тут?
> #define SEEK_SET 0 /* Seek from beginning of file. */
Есть причины не делать этого.
---
"Narrowness of experience leads to narrowness of imagination."

Ivan8209

> Объясните, пожалуйста, сакральный смысл #define
> вот тут:
> enum
> {
> FTW_F, /* Regular file. */
> #define FTW_F FTW_F
Есть такое слово --- "совместимость."
---
"Рот фронт, группенфюрер..."

Serab

Есть такое слово --- "совместимость."
зачем ты это пишешь? Да, есть, здесь это можно понять многими способами, скажи, что ты имел в виду.

vall

его не так уж и сложно понимать, нужно всего-лишь использовать мозг

Werdna

вот тут:
был говнокод.

Serab

наверное, чтоб можно было потом #ifdef использовать
Кстати да, чтобы использовать #ifdef достаточно написать #define FTW_F, но там именно #define FTW_F FTW_F, что как бы говорит нам...

procenkotanya

как ни странно, если написать #define FTW, то потом FTW нельзя будет использовать

Serab

:crazy: :)

yolki

как нельзя?


#include <stdio.h>

#define WTF

int WTF main(WTF WTF WTF)
{
WTF printf WTF(WTF "Hello!\n" WTF);
return WTF 0 WTF;
}
WTF WTF WTF

procenkotanya

как нельзя?
осмысленно нельзя

NataliaS

осмысленно нельзя
это еще почему?
#include <stdio.h>

#define FTW jgdfvs

int main
{
int FTW = 8;
printf("%d\n", FTW);
}

tamusyav

Читаем внимательней:
если написать #define FTW
У тебя же в третьей строке написано другое.

NataliaS

даже если и так, #undef пока ещё никто не отменял.

tamusyav

Причем здесь это? Ты можешь привести пример осмысленного использования макроса с пустым значением, кроме как в инструкциях препроцессора (вариант, когда это значение условно пустое, то есть пустое при выполнении какого-то условия, не считается)?

Serab

#define _IN_
#define _OUT_
#define _LENGTHOF_(x)

void F(_IN_ char*str, _IN_ _LENGTHOF_(str) unsigned length, _OUT_ int* something);
Оставить комментарий
Имя или ник:
Комментарий: