Как я могу заставить gcc распознать выражение, содержащее вызовы функций, как константу? - PullRequest
0 голосов
/ 07 марта 2012

gcc не нравится следующий код:

inline const plus(unsigned x,unsigned y) __attribute__((pure));
inline const plus(unsigned x,unsigned y) { return x+y; }

int arr[plus(1,1)];

выдает следующую ошибку:

error: variably modified ‘arr’ at file scope

Единственное, я сделал все, что мог, чтобы сказать gcc, что он может оптимизировать вызов плюс (a, b) к "a + b", и я только передал константы, так что результат должно быть постоянным!

Я что-то упустил, чтобы заставить это работать? Или gcc просто не такой умный?

Между прочим, причина использования плюс (1,1) вместо 1 + 1 в том, что это делает для более общего построения размера массива с использованием макросов.

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Могут быть расширения gcc, которые допускают что-то подобное, но, по крайней мере, в стандартном C вызов функции никогда не считается постоянным выражением, независимо от того, сколько const вы добавляете или насколько оно на самом деле является константой.Возможно, вам придется использовать макрос вместо:

#define plus(x, y) ((x)+(y))
1 голос
/ 07 марта 2012

Насколько я понимаю, память для arr[] логически выделена еще до вызова main (), и инициализация всех статических переменных гарантированно завершена, а компилятор - нет ( позволено быть достаточно умным, чтобы выяснить, безопасна ли функция, на которую вы ссылаетесь, до инициализации всей статики.

Другими словами, единственный способ сделать это - (как Томас делает в своем ответе) использовать макрос #define, который вычисляется во время компиляции до константы 2.

...