Размер по умолчанию интегральной литеральной константы - PullRequest
1 голос
/ 24 декабря 2010
void foo(void* arg)
{

}

int main(int argc, char** argv)
{
  foo((void*)1);
  return 0;
}

Существует ли какой-либо стандарт, которому должны соответствовать компиляторы, который определяет размер по умолчанию (в байтах) интегральной литеральной константы, передаваемой в foo?

Ответы [ 2 ]

2 голосов
/ 24 декабря 2010

Вы не передаете целочисленную литеральную константу в foo;вы передаете void *, размер которого определен как sizeof(void *).

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

  • у вас есть прототип для функции;в этом случае целочисленное константное выражение преобразуется в объявленный тип соответствующего аргумента перед вызовом функции.
  • у вас нет прототипа для функции, или это аргумент с переменным числом аргументов;в этом случае аргумент будет передан как int.( caf правильно отмечает, что это не относится к целочисленным константным выражениям с более высоким рангом, чем int, например 35U или -17L).
2 голосов
/ 24 декабря 2010

Нет. Существует только размер аргумента, который ожидает функция, и это, очевидно, размер указателя (4 на i386 или 8 на x86_64 и т. Д.). Также см. соглашение о вызовах вики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...