2015-02-16 2 views
1

У меня есть программа, имеющая десятки (возможно, более 100) функций с тем же списком параметров и возвращаемым типом. Я также могу добавить параметр к этим функциям. Итак, есть ли способ определить эти функции с прототипом typedef (со списком параметров)?C function typedef: определение функции без списка параметров

пример: У меня есть множество функций int f1 (int, int) поэтому у меня есть десятки заявлений, как:

int f1 (int x, int y){...} 
int f2 (int x, int y){...} 
.... 
int fn(int x, int y){...} 

Я хотел бы определить то что-то вроде:

typedef int functiontype(int x, int y); 
functiontype f1{...} 
... 
functiontype fn{...} 

Итак, когда мне нужно обновить эти функции (например, с новым параметром z) мне нужно только обновить предложение typedef. Это как-то возможно?

+0

Вы, вероятно, следует генерировать свои функции, а не писать их вручную. –

ответ

3

Вы можете использовать макрос препроцессора, как этот

#define FUNCTION(function) int function(int x, int y) 

/* prototype */ 
FUNCTION(f1); 
/* definition */ 
FUNCTION(f1) 
{ 
    /* do something here, for example */ 
    return y - x; 
} 
+0

Черт, 10 секунд не много. – Quentin

+0

Почему я не думал об этом ........ Grrrr. – haccks

+0

@Quentin тоже мало, и странно, что вы выбрали одно и то же имя для макроса, но, конечно, очень маловероятно, что вы увидели мой ответ, прежде чем отправлять свои сообщения. –

3

не с ЬурейиМ, но вы можете использовать макрос:

#define FUNCTION(name) int name(int x, int y) 

FUNCTION(f1) { 
    // ... 
} 

FUNCTION(f2) { 
    // ... 
} 
1
#define STANDARD_FUNCTION(fname) int fname(int x, int y) 
STANDARD_FUNCTION(f1) { /*do work; return int; */ } 
STANDARD_FUNCTION(f2) { /*do work; return int; */ } 
STANDARD_FUNCTION(f3) { /*do work; return int; */ } 

Тогда позже, когда вы добавляете новый параметр , вам остается только изменить:

#define STANDARD_FUNCTION(fname) int fname(int x, int y, double newParam) 
6

Нет, не совсем. Используйте struct:

typedef struct 
{ 
    int x; 
    int y; 
    int z; //added 
} Params; 

int the_function(Params p); 

Таким образом, вы избежите нарушая исходный код функций, которые декларируют z.

С составных литералов, вы можете даже избежать именования struct:

the_function((Params){ 2, 5 }); // after adding .z, the source code is unchanged. Its value is 0. Or... 
the_function((Params){ .x = 2, .y = 5 }); // named arguments with C99 designated initializers! 
+1

Nice. Однако typedef не имеет смысла. – Quentin

+0

А также это альтернативное решение, а не ответ на сообщение. –

+0

@iharob Почему? Это прекрасно отвечает на вопрос. Я не вижу, где OP специально запрашивает макросы. – ElderBug

Смежные вопросы