2013-06-07 3 views
0

Мне нужно объединить строки, используя макросы, для генерации имен функций.Использование макроса на языке C

#define CONCAT(a,b,c) a ## b 

int i=1; 
CONCAT(a,i) 

Этот код дает ai как результат, в то время как то, что я хотел это a1.

Поскольку в моем исходном коде много функций, я не хочу перечислять их.

Моя цель:

for(int i=0;i<100;i++) 
{ 
    Funi1();//here i should be from 0 to one hundred 
    Funi2(); 
    Funi3(); 
    Funi4(); 
    .. 
} 

@Potatoswatter

Я написал сценарий, чтобы расширить его и стоимость выходного файла сервала сотен строк. @ Eric Finn

+7

замещение происходит, если предварительная обработка, до того, как компилятор имеет какое-либо понятие переменной 'i' со значением' 1'. Что вы на самом деле пытаетесь написать? – BoBTFish

+2

Предлагаю вам ознакомиться с тем, как (и когда) работает препроцессор ... –

+0

Пожалуйста, объясните, почему вам нужен набор функций, определенных с помощью макросов, а не одна функция с целым параметром. Как вы описали, это не убеждает, что вам действительно нужно то, что вы пытаетесь сделать. – hdante

ответ

8

Это невозможно, так как макросы расширяются на этапе предварительной обработки. Таким образом, он не может принимать значение переменной и concat.

+0

Вы можете , конечно, использовать переменную MACRO. –

+0

@HotLicks Что значит? Если вы имеете в виду '# define', это не сработает. – mwerschy

+0

@Hot Licks Как я могу это достичь? –

0

Что относительно __COUNTER__ предопределенный макрос, вы имеете его на GCC и VC. Помогает ли вам это?

#include <stdio.h> 
#define FUNC2(x,y) x##y 
#define FUNC1(x,y) FUNC2(x,y) 
#define FUNC(x) FUNC1(x,__COUNTER__) 

int FUNC(my_unique_prefix); 
int FUNC(my_unique_prefix); 

int main() { 
    my_unique_prefix0 = 0; 
    printf_s("\n%d",my_unique_prefix0); 
    my_unique_prefix0++; 
    printf_s("\n%d",my_unique_prefix0); 
} 

Пример из here

+0

Вещи, которые работают только один раз, а затем ломаются, сосут. Boost Preprocessor предлагает механизмы многократного использования, но трудно помочь, если мы не знаем, в чем цель. – Potatoswatter

0

вы можете предварительно скомпилировать его с: GCC -E sourcecode.c и смотреть его, он просто заменить имя переменной, а не получить значение и рассчитать на всех, так что это не можно позволить ему работать так, как вы хотите.

0

попробовать с ЛИНИИ макросъемки, это дает и номера :), если и не заботиться о + 1 1 + 1 + 1 как статического Int FUNCADD (один раз, ЛИНИИ) = 1, если (FUNCADD (один раз, ЛИНИЯ)> 0)

если Worx для и