Макрос C ++ с памятью - PullRequest
4 голосов
/ 02 марта 2012

Первоначально опубликовано как ответ на макросы c ++ с памятью?

Но почему-то я не могу это скомпилировать. Я мог бы что-то здесь упустить. (У меня есть ощущение, что это то, что может сделать C ++)

main.cpp

#include <iostream>
using namespace std;

const char * hello = "hello";
const char * world = "world";

#define VAR

#define MEMORIZE world
#include "memorize.h"
#define MEMORIZE hello
#include "memorize.h"

int main() {
    cout << VAR << endl;
    return 0;
}

memorize.h

#undef VAR
#ifndef MEMORIZE
    # error "No Argument to memorize.h"
#endif
#define VAR MEMORIZE
#undef MEMORIZE

Я получаю сообщение об ошибке компиляции:

[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
error: use of undeclared identifier 'MEMORIZE'
    cout << VAR << endl;
            ^
note: instantiated from:
#define VAR MEMORIZE
            ^
1 error generated.
make[2]: *** [CMakeFiles/main.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/main.dir/all] Error 2
make: *** [all] Error 2

Я действительно хочу, чтобы эта память работала на этапе предварительной обработки. Может кто-нибудь помочь? Я думаю, BOOST_PP_COUNTER в 1.49 также использует эту технику, но я не мог понять, как.

Ответы [ 3 ]

1 голос
/ 02 марта 2012

Вы используете только одно значение VAR (последнее), поскольку оно может принимать только одно значение.Если вы хотите обозначать разные вещи как VAR в зависимости от контекста, вам нужно иметь исходные операторы после каждого включения.

#define xstr(a) str(a)
#define str(a) #a
int main() {
#define MEMORIZE world
#include "memorize.h"
      cout << VAR << endl;
#undef MEMORIZE
#define MEMORIZE hello
#include "memorize.h"
      cout << VAR << endl;
          return 0;
}

memorize.h:

#undef VAR
#ifndef MEMORIZE
    # error "No Argument to memorize.h"
#endif
#define VAR xstr(MEMORIZE)
0 голосов
/ 02 марта 2012

Вам нужно переместить строку #undef MEMORIZE - выньте ее из memorize.h и поместите прямо перед #define MEMORIZE везде, где появляется.

0 голосов
/ 02 марта 2012

Вы устанавливаете для макроса VAR токен MEMORIZE, который вы быстро отменяете. Линия:

cout << VAR << endl;

заканчивается как:

cout << MEMORIZE << endl;

, а поскольку MEMORIZE не объявлено, вы получите ошибку. Он считает MEMORIZE именем переменной.

...