GCC Проверка во время компиляции постоянных входов функций - PullRequest
2 голосов
/ 25 февраля 2012

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

Примечание: __builtin_constant_p (выражение) должно возвращать, известно ли, что выражение является константой во время компиляции.будет ли порт <2 при вызове uart (port), должен работать следующий код: </p>

#include <stdio.h>

void _uart(int port) {
 printf("port is %d", port);
}

#define uart(port) \
 static_assert(__builtin_constant_p(port)? port<2: 1, "parameter port must be < 2"); \
 _uart(port)

int main(void) {
 int x=1;
 uart(x);
}

Это работает при вызове uart ().К сожалению, это не совсем работает для непостоянного х.По какой-то причине static_assert не может обработать случай, когда x не является константой, хотя в теории __builtin_constant_p () даже не передаст ей константу.Я получаю сообщение об ошибке:

c:\>gcc a.cpp -std=c++0x -Os
a.cpp: In function 'int main()':
a.cpp:13: error: 'x' cannot appear in a constant-expression

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 13 марта 2014

Ваш код работает с g ++ (GCC) 4.8.2.

- но не с оптимизацией, как вы правильно заметили.

Если бы мы могли использовать

static_assert(__builtin_choose_expr(__builtin_constant_p(port), \
                          port<2, 1), "parameter port must be < 2")

- но, к сожалению, конструкция __builtin_choose_expr в настоящее время доступна только для C.

Однако есть патч C ++ , который, к сожалению, еще не попал в релиз.

1 голос
/ 25 февраля 2012

Вы можете попробовать трюк, используемый в ядре Linux:

Что такое ": - !!"в коде C?

(несколько ужасный) макрос ядра Linux менее строг в отношении того, какие выражения разрешены в параметре.

...