Nano Hash - криптовалюты, майнинг, программирование

Как использовать ## в макросе?

Вот простая демонстрация. Но Xcode показывает мне ошибку «вставка сформированного» -> client_port», недопустимый токен предварительной обработки, расширенный из макроса «PARSE_COLUMN» cfg->##column = value»

Я просто хочу быстро установить значение для своей структуры, и в чем проблема с 'cfg->##column = value'

#include <stdio.h>

#define PARSE_COLUMN( column, value ) \
    printf("parse column:%s\n",#column);\
    cfg->##column = value

typedef struct {
    int client_port;
} server_config;

int main(void) {
    server_config *cfg = new server_config;
    PARSE_COLUMN(client_port,123);
    return 0;
}
19.06.2018

  • Как вы думаете, что означает cfg->##column? ## (конкатенация токенов) кажется мне бессмысленным. Вы только что имели в виду cfg->column? 19.06.2018
  • Обратите внимание, что new server_config — это синтаксическая ошибка в C. 19.06.2018

Ответы:


1

## используется для объединения двух действительных токенов препроцессора в один. cfg-> не является допустимым токеном препроцессора, а скорее cfg. Поэтому вы получаете ошибку компилятора.

В этом случае вы можете просто бросить ## и он будет работать: cfg->column = value.

Обратите внимание, что макросы, подобные этим, обычно являются плохой практикой, а функции предпочтительнее.

19.06.2018

2

## используется для объединения двух аргументов макроса, например, column##value будет заменено на client_port123 в приведенном выше коде.

Вам не нужно использовать его здесь, вы можете просто написать cfg->column = value.

19.06.2018

3

## используется для разделения токенов, а затем их объединения.

Пример:

#define A1(name, type)  type name_##type##_type
#define A2(name, type)  type name##_##type##_type

A1(a1, int);  /*  int name_int_type; */
A2(a1, int);  /*  int a1_int_type;   */

В макросе A1 name_##type##_type разбивается на 3 части: {name_, type, _type}, только часть 2 < strong>type является допустимым аргументом и может быть заменен.

В макросе A2 name##_##type##_type разбивается на 4 части: {name, _, type, _type}, часть 1 name и часть 3 type являются допустимыми аргументами и могут быть заменены.

19.06.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..