Я пытаюсь написать код для макроса, который возвращает длину строки, и пытаюсь реализовать его с помощью BOOST_PP_WHILE. Код проистекает из того факта, что символ в позиции, заданной position
строки, представленной макро аргументом foo
, может быть получен с помощью #foo[position]
. Компиляция с использованием MSVC или Intel C ++ приводит к аналогичным синтаксическим ошибкам; Если бы вы могли указать, почему код генерирует эти синтаксические ошибки и как я исправил бы код, это было бы очень полезно. Я знаю, что ошибки вызваны кодом в макросе PREDICATE
, но любое выражение, которое я пытаюсь использовать в нем, за исключением BOOST_PP_TUPLE_ELEM
, приводит к ошибке во время компиляции.
Ошибка:
prog.cpp:47:1: error: pasting "BOOST_PP_BOOL_" and ""\"Hello, World!\""" does not give a valid preprocessing token
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:47: error: ‘BOOST_PP_TUPLE_ELEM_2_1’ was not declared in this scope
Как и следовало ожидать, номера строк не очень полезны, поскольку обе они указывают на строку, в которой вызывается макрос MACRO_STRLEN
.
Код
Ниже приведен список источников, в котором я пытаюсь реализовать макрос, который я описываю.
#include <boost/preprocessor/arithmetic/dec.hpp>
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/while.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <cstdio>
#define TEST_STRING0 "Hello, World!"
#define MACRO_IS_NULL_IMPL(x, position) \
#x[position] == '\0'
#define MACRO_IS_NULL(x, position) \
MACRO_IS_NULL_IMPL(x, position)
#define PREDICATE_D(string, position) \
MACRO_IS_NULL(string, position)
#define PREDICATE(n, state) \
PREDICATE_D( \
BOOST_PP_TUPLE_ELEM(2, 0, state), \
BOOST_PP_TUPLE_ELEM(2, 1, state) \
)
#define OPERATION_D(string, position) \
( \
string, \
BOOST_PP_INC(position) \
)
#define OPERATION(d, state) \
OPERATION_D( \
BOOST_PP_TUPLE_ELEM(2, 0, state), \
BOOST_PP_TUPLE_ELEM(2, 1, state) \
)
#define MACRO_STRLEN_IMPL(string) \
BOOST_PP_TUPLE_ELEM( \
2, 1, BOOST_PP_WHILE(PREDICATE, OPERATION, (string, 0)) \
)
#define MACRO_STRLEN(string) \
MACRO_STRLEN_IMPL(string)
int main(int argc, char ** argv) {
printf("String length: %d.\n", MACRO_STRLEN(TEST_STRING0));
return 0;
}