LINUX.ORG.RU

GCC и Макрос


0

1

Все привет. Вообщем нужно следующее

Makefile

...
CFLAGS = ... -DARCH=intel
...

file.c

#define basef(p1, p2) p1##_p2
#define f1 basef(ARCH, f1)
#define f2 basef(ARCH, f2)
#define f3 basef(ARCH, f3)


void intel_f1() {
...
}
void intel_f2() {
...
}
void intel_f3() {
...
}

...
void init() {
   f1();
   f2();
   f3();

но что то у меня никак не получается сделать задуманное...Вместо подстановки intel_f1 я получаю ARCH_f1 и соответственно undefined reference to `ARCH_f1'

Кто что скажет

CFLAGS = ... -DARCH=\"intel\"
imb ★★
()
#!/bin/bash

gcc -DARCH=intel -E -xc - <<EOF
#define basef_(p1, p2) p1##_p2
#define basef(p1, p2) basef_(p1,p2)
basef(ARCH,f1)
ARCH
EOF
anonymous
()

Вместо подстановки intel_f1 я получаю ARCH_f1

а оно разве когда-то умело рекурсивно подставлять макро в макро?

emulek
()

Вместо подстановки intel_f1 я получаю ARCH_f1

Ну и правильно, cpp работает в один проход. И зачем ты вообще занимаешься этой хернёй? gcc и без макросов всё заинлайнит как надо.

no-such-file ★★★★★
()

может лучше просто подключать соответствующий код?

#ifdef ARCH_INTEL
#  include "intel.c"
#elif ARCH_ARM
#  include "arm.c"
#else
#  error "define ARCH: [ARCH_INTEL or ARCH_ARM]"
#endif
или эту же идею на уровне системы сборки реализовать?

anonymous
()

У тебя не раскрывался макрос внутри basef(). Лови:

#ifndef ARCH
#error "Define ARCH!"
#endif
#define basef(p1, p2) p1##_p2
#define SOL(a,b)  basef(a,b)
#define f1() SOL(ARCH, f1)
#define f2() SOL(ARCH, f2)
#define f3() SOL(ARCH, f3)


void intel_f1() {
...
}
void intel_f2() {
...
}
void intel_f3() {
...
}

...
void init() {
   f1();
   f2();
   f3();
gcc -E -DARCH=intel 1.c 
# 1 "1.c"
# 1 "<command-line>"
# 1 "1.c"
# 11 "1.c"
void intel_f1() {
...
}
void intel_f2() {
...
}
void intel_f3() {
...
}

...
void init() {
   intel_p2;
   intel_p2;
   intel_p2;
Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.