2013-09-19 2 views
2

§ 6.7.6.3 Функция declaratorsФункция declarators в C

2) Единственное хранения класса спецификатор, который должен иметь место в объявлении параметра является регистром.

§ 6.7.6.3 Функция declarators

13) хранения класса спецификатор в декларации спецификаторов для декларации параметра, если он присутствует, игнорируется, если заявленный параметр не является одним из членов Список типов параметров для определения функции.

Я предрек и определил, как это ...

int function(static int param) 
{ 
    return param; 
} 

Visual Studio бросает предупреждение. Я понял, что если мы используем register как тип параметра в объявлении функции, он должен компилироваться без предупреждения. Помимо register, он игнорирует класс хранения и выдает пользователю предупреждение. Правильно ли я понимаю?

Благодаря

+0

Вы можете включить предупреждение, которое Visual Studio дает вам? –

+0

«Регистрирует ли даже« разницу »в современных компиляторах? – dreamlax

+0

@druciferre: предупреждение C4042: 'param': имеет плохой класс хранения – StackIT

ответ

7

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

1

Прежде всего, компилятор, который вы получаете с Visual Studio, не соответствует стандарту c99/c11.

Функция definition не должна допускать использование спецификаторов класса хранения, отличных от register. Он должен обозначать это как плохое использование класса хранения. Как указано, VS компилятор не соответствует стандарту, он выдает предупреждение.

1

AS заявила, что Visual Studio не соответствует стандарту c99/c11.
вот почему это бросается как предупреждение. если вы собираете с GCC ..

вы получите error: storage class specified for parameter âparamâ в месте декларирования функции и Defination функции

Вы можете использовать только регистры должны не другие из них, как статические, ехЬегпа