2013-11-14 4 views
1

Возможно ли в C++ создать переменную, которая будет расширяться после каждого разного использования ее значения?C++ define изменчивый макрос

Например, я хочу, что после

#define mytype [smth here] 
void foo(mytype a,mytype b,mytype c) 

будет расширен в

void foo(mytype1 a,mytype2 b,mytype3 c) 

или

void foo(mytype1 a,mytype11 b,mytype111 c) 
+6

короткого ответа Нет; long answer: Nooooooooo – Raxvan

+0

Макросы расширяются во время предварительной обработки. Вы не можете. – devnull

+0

Зачем вам это нужно? –

ответ

1

Вы не можете иметь макрос, который изменяет то, что он расширяется , но вы можете сделать то, что он расширяет, чтобы обозначать разные вещи:

std::string foo() 
{ 
    static int x; 
    return std::string("myvar") + std::to_string(x++) + "\n"; 
} 

#define myvar foo() 

и

cout<<myvar; 
cout<<myvar; 

напечатает

myvar1 
myvar2 
+1

Я не ставил точку с запятой в определение 'myvar' ... – leemes

+0

@leemes ya, хорошая точка. Также отсутствует новая строка. –

+0

foo() будет расширен во время работы, но мне нужно это во время компиляции ( – Somnium

0

Если это должно увеличить только при выводе, вы можете определения структуры переопределяя operator<<, например:

struct myvarstruct { 
    int i; 
    myvarstruct() : i(1){} 
} myvar; 

ostream &operator << (ostream &o, myvarstruct &s) { 
    return o << "myvar" << s.i++; 
} 
+0

Мне нужно, чтобы он увеличивался во время предварительной обработки/компиляции, а не времени работы. – Somnium

3

Ниже приведен пример использования Boost.Preprocessor для достижения параметров функции вещи:

#include <boost/preprocessor/repetition/enum_binary_params.hpp> 

void foo(BOOST_PP_ENUM_BINARY_PARAMS(3, mytype, p)); 

Это будет расширяться до

void foo(mytype0 p0, mytype1 p1, mytype2 p2); 
-1
#define mytype [smth here] 
#define TYPE(a, b) _TYPE(a, b) 
#define _TYPE(a, b) a##b 
void foo(TYPE(mytype, 1) a, TYPE(mytype, 2) b, TYPE(mytype, 3) c) 
Смежные вопросы