Как я могу объявить переменные с помощью макросов? - PullRequest
4 голосов
/ 05 августа 2011

Прежде всего, я использую Visual Studio MS и использую язык Си.

В последнее время мне нужно объявлять переменные одним и тем же оператором, который любит макрос.

Однако, как вы знаете, я могу объявить только одну переменную с таким же именем.

например, это невозможно.

int iVar1;
int iVar1; // this is not possible. 

, поэтому я подумал о макросах, включающих __ LINE __ , если я могу использовать этот предопределенный макрос, я могу объявить множество переменных с помощью всего одного оператора макроса,

Но это было сложно сделать.

Я сделал такой макрос.

#define MY_LINE_VARIABLE        int g_iLine##__LINE__##Var = 0;

но после компиляции я мог бы получить эту переменную с именем 'g_iLine_ LINE _Var' вместо 'g_iLine123Var'

Я хочу знать, что это такая возможность,и как я могу это сделать.

Кроме того, мне нужно использовать макрос __ FILE __ , если это возможно.но этот макрос может быть изменен со строковыми данными.поэтому я не могу быть уверен.

Любой совет будет полезен.

Заранее спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

Как справедливо сказал @Chris Lutz, возможно, есть лучший способ выполнить то, что вы хотите.Попробуйте спросить, чего вы хотите достичь.

Но если вам просто любопытно, вот способ сделать:

#define var(z) int g_iLine##z##var = 0
#define decl(x) var(x)
#define MY_LINE_VARIABLE        decl(__LINE__)
MY_LINE_VARIABLE;
MY_LINE_VARIABLE;
3 голосов
/ 05 августа 2011

С эта ссылка:

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

Так что в вашем случае:

MY_VARIABLE_LINE преобразуется в int g_iLine__LINE__Var;.Но теперь __LINE__ больше не является допустимым токеном и не рассматривается как предопределенный макрос.

Код Адитьи работает следующим образом:

MY_VARIABLE_LINE преобразуется в decl(__LINE__), который преобразуетсяв var(123), который преобразуется в int giLine123var = 0.

Редактировать: это для GNU C

...