имя переменной в качестве аргумента макроса - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать макрос в c, который возьмет имя переменной и объявит ее.Я мог бы назвать это так:

MY_MACRO(test);

будет производить:

int test;

Чтобы добиться этого, я пошел следующим образом:

#define MY_MACRO(var)   /
    int ##var;          /

Но компиляторне понимает этогоСуществует ли такой синтаксис в C11?

Ответы [ 4 ]

0 голосов
/ 17 января 2019

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

#define MY_MACRO(ident) \
    int ident

int main() {
    MY_MACRO(test);
    test =42;
    return test;
}

Тем не менее, вы искали typedefs ? В отличие от typedef, макросы считаются плохой практикой.

0 голосов
/ 17 января 2019

## здесь не применимо, так как он объединяет токен с чем-то другим

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define MY_MACRO(var) int var   

или

#define MY_MACRO(var) \
int var          \

void foo(void)
{
    MY_MACRO(a);

    a = rand();

    printf("%d\n",a);
}
0 голосов
/ 17 января 2019

## вставляет два токена в один токен.

#define poem(var)\
    int jack##var;

// Produces 'int jacksprat;'
poem(sprat)

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

#define MY_MACRO(var)\
    int var;
0 голосов
/ 17 января 2019

Я бы не советовал делать такие вещи. Во всяком случае, есть две проблемы. Прежде всего, чтобы пропустить новую строку, вам нужно \, а не /.

Во-вторых, ## не так. То, что он делает - это объединение var в int. Таким образом, с MY_MACRO(foo) вы получите intfoo;, но вы хотите int foo;

Макрос должен быть таким:

#define MY_MACRO(var)   \
int var 
...