2013-02-11 2 views
1

Я экспериментирую с макропрограммами, подобными препроцессорам, поэтому я пытаюсь написать макрос, который вперед объявляет обычные функции. Но когда я собираюсь скомпилировать, он говорит, что строка 2 имеет неправильный синтаксис.Написание препроцессора Функция: Правильно ли синтаксис

Что я делаю неправильно?

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) "int" #fName "(int id, string msg, string cmd);" 
FORWARD_DECLARE_CUSTOM_FUNCT("abc") // LINE 2: Should become "int abc(int id, string msg, string cmd);" 

void test() 
{ 
    abc(1, "", ""); 
} 
+0

Почему он должен стать ' "ИНТ ..."' а не '' ква ...? – chris

+0

@chris Ok Я удалил все кавычки, но я все еще получаю ошибку компиляции: '#define FORWARD_DECLARE_CUSTOM_FUNCT (fName) int #fName (int id, string msg, string cmd);' –

ответ

3

Проблема заключается во всех кавычках.

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) "int" #fName "(int id, string msg, string cmd);" 

переводит (после конкатенации строковых литералов):

"int abc (int id, string msg, string cmd);" 

Принимая во внимание,

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) int #fName (int id, string msg, string cmd); 

переводит:

int "abc" (int id, string msg, string cmd); 

Что вам действительно нужно, это просто:

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) int fName (int id, string msg, string cmd); 

Используйте это так:

FORWARD_DECLARE_CUSTOM_FUNCT(abc) 

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

2

Вам нужно уйти от строчки. Вы не записываете функции со строками для имен; вы не записываете такие функции в препроцессор с такими обозначениями.

Посмотрите на выходе из препроцессора:

g++ -E yourfile.cpp 

или его эквивалент. Выход, который я получаю из двух ваших линий:

"int" "\"abc\"" "(int id, string msg, string cmd);" 

И это не очень похоже на объявление функции; это строка, содержащая что-то похожее на объявление функции (но вложенные двойные кавычки смущают даже это).

Очистка немного:

#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) int fName(int id, string msg, string cmd) 
FORWARD_DECLARE_CUSTOM_FUNCT(abc); 

Примечание передача запятой от макроопределении к макро вызова; это выглядит лучше для опытного программиста на C++ (хотя любые макросы являются чем-то вроде анафемы для программистов на C++, они более приемлемы для программистов C).

3

Если вы пытаетесь это сделать, я рекомендую использовать флаг -E для g++ (если вы используете gcc, MSVC или какой-либо другой компилятор, у вас будет что-то подобное). После этого препроцессор будет распечатывать файл.

Во всяком случае, то, что вы ищете что-то вроде этого:

//No # 
#define FORWARD_DECLARE_CUSTOM_FUNCT(fName) void fName(int id, string msg, string cmd); 

FORWARD_DECLARE_CUSTOM_FUNCT(abc) //No "" 

void test() 
{ 
    abc(1, "", ""); 
} 
Смежные вопросы