LINUX.ORG.RU

что означает: ' #x' в макросе ?


0

0

Извините за глупый вопрос, сам не нашел точный ответ. :(
Проконсультируйте пожалуйста.
Что означает ' #x' в макросе:
#define __MODULE_STRING_1(x)    #x
#define __MODULE_STRING(x)      __MODULE_STRING_1(x)

что значит #x ?
anonymous

Заменить аргумент текстом. Перевести в строковую константу.

SatanClaus ★★★
()

А воспользоваться gcc было не судьба? :)

roman@romanu:~/test/macro> cat test.c


#define __MODULE_STRING_1(x)    #x
#define __MODULE_STRING(x)      __MODULE_STRING_1(x)

void test()
{
    __MODULE_STRING_1(a);
    __MODULE_STRING(a);
}

roman@romanu:~/test/macro> gcc -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "test.c"





void test()
{
    "a";
    "a";
}
roman@romanu:~/test/macro>

RomanU
()

> что значит #x ?

Заменяется на значение x в кавычках:

__MODULE_STRING_1(module) -> "module"

DKorolkov
()

Что, документацию по C уже отменили?
Или ломает даже запустить gcc -E и посмотреть,
что получится на выходе препроцессора:

--------------- cut ----------------
$ cat m.c

#define __MODULE_STRING_1(x)    #x
#define __MODULE_STRING(x)      __MODULE_STRING_1(x)
 
__MODULE_STRING(ABCDEF);

$ gcc -E m.c
# 1 "m.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "m.c"
 
 
 
"ABCDEF";
--------------- cut ----------------

Теперь понятно? 
Ну и для закрепления выдержка из ISO/IEC 9899:1999 :

If, in the replacement list, a parameter is immediately preceded
by a # preprocessing token, both are replaced by a single character 
string literal preprocessing token that contains the spelling of
the preprocessing token sequence for the corresponding argument.

HTH

Onanim
()
Ответ на: комментарий от Onanim

Вы не сердитесь, я самоучка и много пробелов. 
но кое что понял, как работает в программоном коде,
спасибо.

#define __MODULE_STRING_1(x)    #x
#define __MODULE_STRING(x)      __MODULE_STRING_1(x)

int main(void) {
 char  ch[40] = __MODULE_STRING(ABCDEF);
 printf("%s \n", ch);
 return  0;
}

$ gcc m.c
$ ./a.out
ABCDEF
$

"gcc -E" - я и не знал раньше, что это за штука. :(( 
-------------------
$ gcc -E m.c
# 1 "m.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "m.c"
 
"ABCDEF";
------------------
А можите прокоментировать строчки:
# 1 "m.c"
# 1 "<built-in>"          <--  ??
# 1 "<command line>"      <--  ??
# 1 "m.c"

Если не сложно конечно.

anonymous
()
Ответ на: комментарий от Onanim

LOL

навалились на человека всем скопом одновременно:))

RomanU
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.