Как достигнуть перегрузки функции в C?

Почему бы и нет. Вы все еще можете сохранить его в папке public_html, изменив доступ к частному.

Никто не сможет получить доступ к папке извне.

Для этого вы можете использовать файл htaccess, чтобы ограничить весь доступ к папке.

Вот фрагмент, чтобы сделать это

RewriteEngine On
RewriteRule (^|/)folderName(/|$) - [F]

Как создать файл htaccess очень просто! перейдите в корневую папку, затем создайте имя файла с помощью .htaccess

234
задан Gaurang Tandon 3 July 2018 в 07:35
поделиться

8 ответов

Существует немного возможностей:

  1. printf разрабатывают функции (тип как аргумент)
  2. функции стиля opengl (тип на имя функции)
  3. c подмножество C++ (если можно использовать компилятор C++)
125
ответ дан Jacek Ławrynowicz 23 November 2019 в 03:29
поделиться

Как уже указано, перегружение в том смысле, что Вы имеете в виду, не поддерживается C. Общая идиома для решения проблемы заставляет функцию принять размеченное объединение . Это реализовано struct параметр, где struct сам состоит какой-то из индикатора типа, такой как enum, и union из различных типов значений. Пример:

#include <stdio.h>

typedef enum {
    T_INT,
    T_FLOAT,
    T_CHAR,
} my_type;

typedef struct {
    my_type type;
    union {
        int a; 
        float b; 
        char c;
    } my_union;
} my_struct;

void set_overload (my_struct *whatever) 
{
    switch (whatever->type) 
    {
        case T_INT:
            whatever->my_union.a = 1;
            break;
        case T_FLOAT:
            whatever->my_union.b = 2.0;
            break;
        case T_CHAR:
            whatever->my_union.c = '3';
    }
}

void printf_overload (my_struct *whatever) {
    switch (whatever->type) 
    {
        case T_INT:
            printf("%d\n", whatever->my_union.a);
            break;
        case T_FLOAT:
            printf("%f\n", whatever->my_union.b);
            break;
        case T_CHAR:
            printf("%c\n", whatever->my_union.c);
            break;
    }

}

int main (int argc, char* argv[])
{
    my_struct s;

    s.type=T_INT;
    set_overload(&s);
    printf_overload(&s);

    s.type=T_FLOAT;
    set_overload(&s);
    printf_overload(&s);

    s.type=T_CHAR;
    set_overload(&s);
    printf_overload(&s); 
}
75
ответ дан Nils von Barth 23 November 2019 в 03:29
поделиться

Следующий подход является аналогичным a2800276, но с некоторым макро-добавленным волшебством C99:

// we need `size_t`
#include <stddef.h>

// argument types to accept
enum sum_arg_types { SUM_LONG, SUM_ULONG, SUM_DOUBLE };

// a structure to hold an argument
struct sum_arg
{
    enum sum_arg_types type;
    union
    {
        long as_long;
        unsigned long as_ulong;
        double as_double;
    } value;
};

// determine an array's size
#define count(ARRAY) ((sizeof (ARRAY))/(sizeof *(ARRAY)))

// this is how our function will be called
#define sum(...) _sum(count(sum_args(__VA_ARGS__)), sum_args(__VA_ARGS__))

// create an array of `struct sum_arg`
#define sum_args(...) ((struct sum_arg []){ __VA_ARGS__ })

// create initializers for the arguments
#define sum_long(VALUE) { SUM_LONG, { .as_long = (VALUE) } }
#define sum_ulong(VALUE) { SUM_ULONG, { .as_ulong = (VALUE) } }
#define sum_double(VALUE) { SUM_DOUBLE, { .as_double = (VALUE) } }

// our polymorphic function
long double _sum(size_t count, struct sum_arg * args)
{
    long double value = 0;

    for(size_t i = 0; i < count; ++i)
    {
        switch(args[i].type)
        {
            case SUM_LONG:
            value += args[i].value.as_long;
            break;

            case SUM_ULONG:
            value += args[i].value.as_ulong;
            break;

            case SUM_DOUBLE:
            value += args[i].value.as_double;
            break;
        }
    }

    return value;
}

// let's see if it works

#include <stdio.h>

int main()
{
    unsigned long foo = -1;
    long double value = sum(sum_long(42), sum_ulong(foo), sum_double(1e10));
    printf("%Le\n", value);
    return 0;
}
11
ответ дан Christoph 23 November 2019 в 03:29
поделиться

В смысле Вы имеете в виду — нет, Вы не можете.

можно объявить va_arg функция как

void my_func(char* format, ...);

, но необходимо будет передать некоторую информацию о количестве переменных, и их типы в первом аргументе — как printf() делает.

10
ответ дан Quassnoi 23 November 2019 в 03:29
поделиться

Обычно бородавка для указания на тип добавляется или предварительно ожидается к имени. Можно сойти с рук макросы, некоторые экземпляры, но они скорее зависят, что Вы пытаетесь сделать. Нет никакого полиморфизма в C, только приведение.

Простые универсальные операции могут быть сделаны с макросами:

#define max(x,y) ((x)>(y)?(x):(y))

, Если Ваш компилятор поддерживает typeof, более сложные операции могут быть помещены в макрос. У Вас может затем быть нечто символа (x) для поддержки тех же операционных различных типов, но Вы не можете варьироваться поведение между различными перегрузками. Если Вы хотите фактические функции, а не макросы, Вы смогли вставлять тип к имени и использовать вторую вставку для доступа к ним (я не попробовал).

6
ответ дан Pete Kirkham 23 November 2019 в 03:29
поделиться

Вы не можете только использовать C++ и не использовать все другие функции C++ кроме этого?

, Если бы все еще не просто строгий C затем я рекомендовал бы функции variadic вместо этого.

1
ответ дан Tim Matthews 23 November 2019 в 03:29
поделиться

Попытайтесь объявить эти функции как extern "C++", если Ваш компилятор поддерживает это, http://msdn.microsoft.com/en-us/library/s6y4zxec (По сравнению с 80) .aspx

-3
ответ дан dmityugov 23 November 2019 в 03:29
поделиться

Если ваш компилятор - gcc, и вы не против делать обновления вручную каждый раз, когда вы добавляете новую перегрузку, вы можете сделать некоторую магию макросов и получить результат вы хотите с точки зрения вызывающих абонентов, это не так приятно писать ... но возможно

посмотрите на __builtin_types_compatible_p, а затем используйте его для определения макроса, который делает что-то вроде

#define foo(a) \
((__builtin_types_compatible_p(int, a)?foo(a):(__builtin_types_compatible_p(float, a)?foo(a):)

, но да неприятно, просто не делайте этого

РЕДАКТИРОВАТЬ: C1X получит поддержку общих выражений типов, которые выглядят следующим образом:

#define cbrt(X) _Generic((X), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(X)
19
ответ дан 23 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: