2012-02-24 5 views
4

Я читаю через код C базы, и я нашел фрагмент кода, который выглядит примерно так:Перенесите int в const int?

void foo(int bar) { 
    const int _bar = bar; 
    ... 
} 

Затем автор использует _bar в остальной части кода. Почему это делается? Это оптимизация, или есть какая-то другая причина?

+12

Я не вижу никакого преимущества перед объявлением параметра 'const' в первую очередь. –

+1

@Oli: определение параметров не указателя 'const' можно рассматривать как утечку деталей реализации ... – Christoph

+3

@ Кристоф: Это не влияет на внешний мир. Вы можете объявлять свои функции с помощью не-const-параметров в вашем общедоступном API, а затем использовать 'const' в определении. (Фактически это именно то, что я делаю.) –

ответ

4

Предположительно автор делает это, чтобы избежать случайного назначения.

Если параметр не изменяется от ввода функции, автор может поместить константу в подпись парама, как в void foo (int const bar) { ... }.

+0

Но автор мог бы просто объявить параметр 'const' в первую очередь. –

+2

Ну, код находится на C, поэтому ссылки недоступны, если только я * действительно не понимаю C. Если это нужно, чтобы избежать переназначения, почему бы не заглушить «void foo (const int bar)» ? –

+1

О, правильно, ах. Удалил ссылку в моем сообщении. –

6

Затем автор использует _bar в остальной части кода.

Если _bar используется через вне и не используя параметр функции, я бы квалифицировать параметр функции по const.

void foo(const int bar) 
{ 
    // use bar but modifications to bar itself are not allowed. 
} 
3

Как C передает аргументы по значению, нет никакой разницы между

void foo(int bar); 

и

void foo(const int bar); 

, насколько вызывающий код обеспокоен.

Таким образом, const -qualifying параметр non-pointer, возможно, делает деталь внутренней реализации частью публичного API.

Другим решением было бы объявить функцию без const в заголовке и только добавить его к определению (как Oli Чарльзуорт предполагает в комментариях, а), то есть

// in header file 
extern void foo(int bar); 

// in source file 
void foo(const int bar) 
{ 
    // ... 
} 

который - насколько Я знаю - законный из-за последнего предложения C99 6.7.5.3 §15.

+0

Вы делаете некоторые хорошие моменты, но я не согласен с «const-qualifying a non-pointer parameter, возможно, делает внутреннюю часть детали реализации публичного API». Зачем? Из-за этого: 'void foo (int const bar) {int baz = bar;/* использовать baz now * /} 'То есть пользователь не знает, что происходит, даже с параметром const. –

+1

@ trinithis: вы по-прежнему пропускаете информацию, по какой-либо причине аргумент должен быть 'const', который * является * дополнительной информацией, поскольку параметры по умолчанию не должны быть' const'; вы правы, что вы не можете извлечь из этого того, как будет использоваться этот параметр, но это только усиливает тот факт, что квалификация 'const' бесполезна в том, что касается кода вызова ... – Christoph

Смежные вопросы