Зачем использовать функции, которые просто возвращают константу, а не просто константу? - PullRequest
6 голосов
/ 31 мая 2019

Я столкнулся с кодом на GitHub. https://github.com/codeplea/tinyexpr/blob/master/tinyexpr.c

Эти строки привлекли мое внимание:

static double pi(void) {return 3.14159265358979323846;}
static double e(void) {return 2.71828182845904523536;}

Есть ли какая-либо причина использовать функции в этом случае? Почему бы не использовать константы? Вы можете использовать макросы препроцессора, но это может усложнить отладку. Я никогда не видел этого раньше. Есть ли польза от этого?

1 Ответ

8 голосов
/ 31 мая 2019

Основная причина, по которой я могу придумать, состоит в том, чтобы упростить поиск места использования этой константы. Например, вы ищете e( вместо e.

Однако это не так. Функции используются , но не вызываются явно.

Связанный код содержит массив структур:

typedef struct te_variable {
    const char *name;
    const void *address;
    int type;
    void *context;
} te_variable;

...

static const te_variable functions[] = {
    /* must be in alphabetical order */
    {"abs", fabs,     TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"acos", acos,    TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"asin", asin,    TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"atan", atan,    TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"atan2", atan2,  TE_FUNCTION2 | TE_FLAG_PURE, 0},
    {"ceil", ceil,    TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"cos", cos,      TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"cosh", cosh,    TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"e", e,          TE_FUNCTION0 | TE_FLAG_PURE, 0},
    {"exp", exp,      TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"fac", fac,      TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"floor", floor,  TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"ln", log,       TE_FUNCTION1 | TE_FLAG_PURE, 0},
#ifdef TE_NAT_LOG
    {"log", log,      TE_FUNCTION1 | TE_FLAG_PURE, 0},
#else
    {"log", log10,    TE_FUNCTION1 | TE_FLAG_PURE, 0},
#endif
    {"log10", log10,  TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"ncr", ncr,      TE_FUNCTION2 | TE_FLAG_PURE, 0},
    {"npr", npr,      TE_FUNCTION2 | TE_FLAG_PURE, 0},
    {"pi", pi,        TE_FUNCTION0 | TE_FLAG_PURE, 0},
    {"pow", pow,      TE_FUNCTION2 | TE_FLAG_PURE, 0},
    {"sin", sin,      TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"sinh", sinh,    TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"sqrt", sqrt,    TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"tan", tan,      TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {"tanh", tanh,    TE_FUNCTION1 | TE_FLAG_PURE, 0},
    {0, 0, 0, 0}
};

Второй член каждой структуры - это указатель на функцию, используемый для запуска некоторой математической функции, и среди них значения E и PI. Похоже, они были определены как функции для соответствия этой структуре.

...