2016-11-17 4 views
2

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

  1. ABC_00_fld1
  2. ABC_01_fld1

То, что я хотел бы достичь, это передать их аргументы макросу, в C++ и вычеркнуть префиксы. Что-то вроде этого:

#define MAKE_FLD(param)\ 
    some manipulation on param 

Ожидаемый результат:

MAKE_FLD(ABC_00_fld1) => fld1 

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

EDIT: Чтение всех предложений заставляет меня предоставить больше фона. Чтобы дать некоторую перспективу относительно использования этого макроса. Рассмотрим, что приложение создает структуры с использованием макросов. Поэтому каждая структура будет иметь кучу данных. Вышеупомянутый «ABC_00_fld1» становится типом данных класса, который определен в некоторой другой части приложения. Таким образом, в структуре, сгенерированной с помощью макроса, будет выглядеть примерно так.

struct macro_struct_fld1 { 
    ABC_00_fld1 fld1; 
}; 

struct macro_struct_fld2 { 
    ABC_01_fld1 fld1; 
}; 

Этот вышеприведенный фрагмент является мотивацией того, чего я пытаюсь достичь. Существуют и другие способы достижения вышеуказанного, где в моей макрогенерированной структуре вместо передачи списка типов данных я могу передать список перечислений, содержащих тип данных и имя переменной, и извлечь их, но тогда я придется вручную создавать имена, которые мне не понравятся.

+0

Строковые операции - это не то, что макросы очень хороши. Есть несколько вопросов переполнения стека об этом - вы Google? – xaxxon

+0

Может ли ваш макрос расширяться до вызовов функций? –

+0

Что вы намерены делать с этими сокращенными именами переменных? – user4581301

ответ

-1

Вы можете использовать функцию препроцессора C под названием Stringification (https://gcc.gnu.org/onlinedocs/cpp/Stringification.html), чтобы получить строчную версию имени параметра.

Оттуда вы можете манипулировать строкой; что-то вроде этого:

#include <iostream> 
#include <string> 

#define MAKE_FLD(param) (std::string(#param).substr(7)) 

int main() 
{ 
    int ABC_00_fld1 = 0; 

    std::cout << MAKE_FLD(ABC_00_fld1) << std::endl; 

    return ABC_00_fld1; 
} 

Этот выход «fld1». Код, составленный и протестированный здесь: http://cpp.sh/8tkk

+0

Боюсь, что на самом деле это не вопрос (хотя OP говорит о _stringification_). –

+0

Если я что-то не понимаю, OP хочет превратить имена переменных в строки. Существует только один способ сделать это без строковых литералов, которые совпадают с именами параметров; это строение. Также возможно не использовать std :: string, вместо этого увеличивая char * literal на известное количество символов: (#param + 7). Это приведет к вычислению времени вычисления const char * с правильным значением. – qexyn

+1

Я думаю, что op хочет нечто большее, чем 'int MAKE_FLD (ABC_00_fld1) = 0; return fld1; 'работать. Однако нам нужно разъяснение. –