Вопрос по c++ – Что на первом месте - создание шаблона или расширение макроса?

7

Давайте рассмотрим такой пример кода (это всего лишь искусственный пример объединенияdefine а такжеtemplateне ищите никакого смысла в этом):

#define COMMA ,

template <typename A> class Test
{
public:
    Test(){}

    void Foo(A var COMMA int test);
};

Test<int> Knarz;

Question:

Правильно ли мое предположение, чтоfirst препроцессор будет искать / заменять все вхождения COMMA иsecond компилятор будет создавать экземпляры любых шаблонов в этом порядке?

Followup:

Если ответ выше, & apos;yes', как я надеюсь, вы можете объяснить, почему этоРешение с использованием шаблонов и определяет работает?

Ваш Ответ

4   ответа
1

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

Error: User Rate Limit ExceededwhyError: User Rate Limit Exceeded Ronald McBean
Error: User Rate Limit Exceeded
3

собственно макросы просто применят изменения к существующему коду перед компиляцией. Таким образом, в этом решении запятая будет генерировать код шаблона, например:

MOCK_CONSTANT_METHOD0(aMethod, const QMap<QString,QString>());

до компиляции.

Итак, для второго вопроса:

Это связано с тем, как на самом деле работает инфраструктура gmock, MOCK_CONSTANT_METHOD0 является макросом, поэтому строка будет преобразована во что-то другое. Маркус Майр сказал, что запятая будет переведена как разделитель параметров, так что это связано с тем, как в этом случае будут преобразованы макросы gmock. Я предполагаю, что сначала будет заменен макет макроса, а после запятая будет применена внутренне, и это причина, почему он работает с макросом, а не только с запятой.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Ronald McBean
Error: User Rate Limit ExceedednotError: User Rate Limit ExceededisError: User Rate Limit Exceeded Ronald McBean
0

9 этапов перевода.

Is my assumption correct that, first the preprocessor will search/replace all occurrences of COMMA and second the compiler will instantiate any templates in that order?

COMMA токен замещается в фазе 4.
Шаблоны создаются на этапе 8.

10

поэтому вы предполагаете, что препроцессор заменитCOMMA прежде чем шаблон будет создан правильно.

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

Изменить: После просмотра стандарта, я думаю, что решение в целом должно работать, так как препроцессор найдетMOCK_CONSTANT_METHOD0 сначала и замени его. Только тогда он изучит результат замены, чтобы найтиCOMMA макро. Хотя никаких гарантий.

Error: User Rate Limit Exceeded Ronald McBean
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Ronald McBean

Похожие вопросы