Перегрузка в С или нет? - PullRequest
0 голосов
/ 17 марта 2011

Чем функции списков аргументов переменной длины, например printf() , scanf(), etc в C, отличаются от перегрузки функций в C ++?

А как звонит

printf("Didnt Work %s",s);

отличается от

printf(s,"Didnt Work %s");

где s определяется как:

const char *s="string";

Пожалуйста, объясните.

Ответы [ 3 ]

6 голосов
/ 17 марта 2011

В

const char *s="string";
printf(s,"Didnt Work %s");

Первый аргумент "строка" интерпретируется как строка формата. У него нет кодов вставки, поэтому второй параметр никогда не будет использоваться. Результатом будет «строка».

Ото

printf("Didnt Work %s",s);

Существует код вставки, поэтому второй аргумент вставляется в виде строки, в результате получается «Не работает строка».

Это не перегрузка, потому что, хотя возможны разные типы аргументов, как и при перегрузке, с переменными аргументами всегда вызывается одна и та же функция. При перегрузке вызываются разные функции в зависимости от типа аргумента.

0 голосов
/ 17 марта 2011

Чтобы ответить на ваш второй вопрос, другие уже задали первый.

Переменные списки аргументов в C сильно отличаются от перегрузки в C ++.В C у вас есть одна функция printf, которая делает разные вещи с разными типами аргументов.В C ++ с перегрузкой вы выбираете между различными функциями в зависимости от типа аргумента.

0 голосов
/ 17 марта 2011

Перегрузка допускает определенный порядок параметров, который будет проверять компилятор. В C ++, если типы не соответствуют хотя бы одному из определений функций, компилятор будет жаловаться. С другой стороны, C с аргументами переменной длины, ..., не проверяет этот тип во время компиляции. Компилятор не проверяет какие-либо параметры, чтобы убедиться в их соответствии. Вы можете скомпилировать printf("1",3); на большинстве, если не на всех компиляторах. Printf попытается прочитать первый аргумент как строку и будет продолжать чтение, пока не достигнет пустого байта, обозначающего конец строки. Вот почему списки аргументов переменной длины не приветствуются.

...