Как объединить многострочные макросы в C с комментариями в конце строки

У меня есть судорога мозга... есть ли способ в C объединить многострочный макрос с комментарием в каждой строке?

например.

#define MYARRAY { \
 0.001, // 5 mV \
 0.002, // 10 mV \
 0.004, // 20 mV \
 0.007, // 35 mV \
 0.013 // 65 mV \
}

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

4 ответа

Согласно комментарию, это похоже на XY-проблему. Макрос может быть не лучшим.

Если вы столкнулись с таблицей констант, обычным способом было бы просто создать массив один раз и использовать его во всем коде:

static const float cal_table [5] = {
 0.001, // 5 mV
 0.002, // 10 mV
 0.004, // 20 mV 
 0.007, // 35 mV
 0.013 // 65 mV
};

Если это используется только в одном файле, сделайте его static, как показано, иначе удалите static и добавьте

extern const float cal_table[5];

в файл заголовка модуля.

Обратите внимание, что если это для небольшого MCU (AVR/PIC) без блока с плавающей запятой, вам может быть лучше, если не использовать float, но фиксированная точка, имитируемая целыми числами (например, масштабируется до 1 мВ).

Вы также можете использовать это как инициализатор для переменной массива auto. Сделайте этот массив a typedef, сгенерируйте const, как описано, и memcpy массив к локальной переменной по мере необходимости. Это так же быстро, как инициализатор, потому что компилятор также должен скопировать его в локальный массив. Таким образом, вы используете массив const в качестве шаблона (при необходимости, при необходимости меняя одно местоположение).


Вы можете использовать многострочные комментарии как способ продолжения макроопределений с одной строки на другую, а не на обратную косую черту. Как описано в стандарте C, & sect; 5.1.1.2/1, комментарии сводятся к одному пространству во время фазы перевода 3, тогда как директивы предварительной обработки выполняются в фазе 4. В действительности это означает, что символы новой строки внутри многострочного комментария не завершите директиву предварительной обработки, чтобы вы могли написать:

#define MYARRAY { /*
*/ 0.001, /* 5 mV 
*/ 0.002, /* 10 mV
*/ 0.004, /* 20 mV
*/ 0.007, /* 35 mV
*/ 0.013 /* 65 mV
*/ }

Обратите внимание, что продолжения строки (обратная косая черта) удаляются на этапе 2, прежде чем комментарии будут распознаны как таковые. Таким образом, проблема с использованием комментариев С++ - style // заключается не в том, что комментарий включает обратную косую черту; скорее всего, что линии сначала конкатенируются, а затем комментарий продолжается до конца конкатенированных строк.


Вы должны иметь возможность сделать это, но не с комментариями стиля С++. Попробуйте это с традиционными комментариями /* */C. Комментарии С++ комментируют остальную часть строки, включая обратную косую черту.


Не совсем то, о чем вы просите. Без комментариев, но по-прежнему читаемый человеком и он вычисляет значения для вас:

#define MILLI_VOLT(v) (v/5000.0)
#define MYARRAY { \
 MILLI_VOLT(5), \
 MILLI_VOLT(10), \
 MILLI_VOLT(20), \
 MILLI_VOLT(35), \
 MILLI_VOLT(65), \
}
****** a[] = MYARRAY;

licensed under cc by-sa 3.0 with attribution.