2013-09-18 3 views
22

При компиляции в C++ я часто в конечном итоге с сообщениями об ошибках, связанные с «формальными параметрами», такими какЧто такое формальный параметр?

error C2719: 'b': formal parameter with __declspec(align('16')) won't be aligned 

Я понимаю ошибку, а также тот факт, что b является параметром функции Я определяющей.

Однако, что это означает, что параметр официально? Может ли быть неформальным параметров?

Я замечаю, что термин «формальный параметр» появляется и на других языках, поэтому я предполагаю, что это более общий термин, не обязательно специфический для C-семейства языков? Являются ли неофициальные параметры поддерживаемыми некоторыми подмножествами языков?


Увидев ответы, один последний вопрос: где эти имена формальный параметр и фактический параметр происхождения из? Происходит ли это из стандарта C, или это эффект называть его как таковой в каком-то абстрактном исчислении языка?

+0

В данном конкретном случае это означает, что вы пытаетесь передать более трех параметров SSE функции, и вы застряли с Visual Studio и WIN32 ABI. ;-) –

+0

@Paul R: В этом конкретном случае я передавал выровненный параметр по значению, а не 'const &'. – CygnusX1

+3

Относительно того, откуда берутся имена: «формальный» в математике не является противоположностью «неформальной». 'формальный' происходит от' form', то есть 'формальный' означает четко определенную. Например, формальная логика не является противоположностью неформальной логике, а логикой, основанной на четко определенных правилах. Формальные параметры, следовательно, относятся к параметрам, которые определяют форму функции. Фактически, этот показатель очевиден. – Shahbaz

ответ

28

Есть формальный и фактические параметры:

void foo(int arg); //arg is a formal parameter 

int main() 
{ 
    int val = 1; 
    foo(val); //val is an actual parameter 
} 

От C++ Standard:

1.3.1 формальный параметр (параметр)

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

1.3.10 фактический параметр (аргумент)

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

+6

Следует отметить, что эти термины (формальный и фактический параметр) устаревают по стандарту C. Правильными терминами являются «параметр» и «аргумент». –

+0

@R .. Но они все еще функционируют на других языках, я верю? Каков источник? – CygnusX1

+0

Источник - это стандарт C, 3.3 и 3.15 в C99. –

15

Формальные параметры - это параметры, известные в определении функции. Фактические параметры - это то, что вы на самом деле (отсюда и название) переходит к функции, когда вы ее вызываете.

void foo(int a); // a is a formal parameter 

foo(10); // 10 is the actual parameter 
+1

Я думал, что вещь, которую вы передаете функции, является «аргументом», а вещь, которую имеет функция, является «параметром»? – CygnusX1

8

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

int foo(bool a, float b); 

Здесь a и b являются формальными параметрами. Дело в том, что в теле функции вы ссылаетесь на эти параметры «формально», не зная их значения. Только тогда, когда вы фактические оценить выражение вызова функции, что формальные параметры функции являются связаны с аргументами вызова функции:

int result = foo(false, 1.5); 

В этом выражении вызова, значение false первого аргумента обязан формальный параметр a и аналогично для второго аргумента.

Различие между параметрами и аргументами, возможно, более важно для разработчиков языков и авторов компиляторов, но, как пример на C++, может быть очень полезно обдумать это, когда вы пытаетесь следовать правилам для шаблона вычет аргумента.

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