С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
#1

Пустой список параметров в c и c++ - C++

09.09.2012, 18:10. Просмотров 1512. Ответов 14
Метки нет (Все метки)

Работаю в visual studio 2010. Прочитал, что в C пустой список параметров означает, что компилятор не проверяет аргументы и этой функции можно либо не передать ничего, либо что-то передать.

Попробовал сделать так:

C
1
2
3
4
5
6
7
void func(void){
   return 1;
}
 
//main, вызов func
 
func(10,20);
Компилятор ругается, как исправить?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 18:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пустой список параметров в c и c++ (C++):

Вставка элемента в пустой односвязный список - C++
Помогите сделать вставку элемента в пустой односвязный список. У меня работает вставка только при непустом.Заранее благодарен!Функция...

Создать пустой список из 100 элементов - C++
Создать пустой список из 100 элементов... Пожалуйстаааа

STL list. В изначально пустой список вставить 100 элементов путем вставки в случайную позицию - C++
В изначально пустой список вставить 100 элементов путем вставки в случайную позицию. Случайная позиция генерируется каждый раз заново при...

Список формальных параметров в функции - C++
Не понимаю цель формальных параметров. Зачем, например, вводить (int a, int b) в функции int summ(int a,int b) { Return a+b; } ...

Получение значения через список параметров - C++
Доброго времени суток! есть переменная: int *X=NULL; Необходимо передать её адрес в функцию в которой выделяется для неё память и...

Как понять список формальных параметров функции Bar? - C++
class Foo { void friend Bar(Foo & foo); private: int data;

14
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.09.2012, 18:14 #2
Это в Си. Visual Studio компилирует Си++.
0
Байт
Нарушитель
Эксперт C
16689 / 10953 / 1685
Регистрация: 24.12.2010
Сообщений: 21,352
09.09.2012, 18:18 #3
Цитата Сообщение от bgm313 Посмотреть сообщение
Прочитал, что в C пустой список параметров означает, что компилятор не проверяет аргументы и этой функции можно либо не передать ничего, либо что-то передать.
Интересно, где?
Функции f(void) ничего передавать нельзя
Вот для некоторых компиляторов можно в прототипе написать f();
Но в реализации функции написать f(int a, int b), и также обращаться с двумя параметрами.
Но лучше всего этого не делать.
А ежели нужны параметры по умолчанию, о это совсем другой разговор...
0
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
09.09.2012, 18:21  [ТС] #4
Цитата Сообщение от Байт Посмотреть сообщение
Функции f(void) ничего передавать нельзя
Опечатка, так пустые скобочки.

Добавлено через 35 секунд
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Это в Си. Visual Studio компилирует Си++.
Изменил расширение файла на .c

Добавлено через 29 секунд
Цитата Сообщение от Байт Посмотреть сообщение
Интересно, где?
В книгах Шилдта и Дейтелов.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.09.2012, 18:34 #5
Цитата Сообщение от bgm313 Посмотреть сообщение
Изменил расширение файла на .c
Да хоть на pas. Там есть в комплекте конпелятор Си, но его надо вызывать из консоли руками или лезть в ключи и тыкать носом, чтобы всё компилила как Си. Правда, тот компилятор в Студию включен исключительно по историческим причинам, не развивался уже чёрти сколько и даже ANSI C поддерживает с горем пополам.

Ещё немного почитал стандарты. Пока что выходит, что в С99 такие финты явно запрещены (что (), что (void) = не должно быть параметров при вызове), а в ANSI C передача лишних аргументов в функцию без ", ..." в списке аргументов даёт неопределённое поведение.
1
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
09.09.2012, 18:37  [ТС] #6
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Да хоть на pas. Там есть в комплекте конпелятор Си, но его надо вызывать из консоли руками, сама студия всегда компилит как Си++.
Почему тогда ругается компилятор (выдаёт более 100 ошибок) при расширение .c и вводе кода:

C
1
2
3
4
5
6
7
#include <iostream>
 
int main(){
  std::cout << 1;
  return 0;
 
}
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.09.2012, 18:39 #7
Ну тогда пеняйте на "поддерживает с горем пополам". "Не поддерживает стандарт" это не всегда "не реализовано указанное в стандарте", а иногда и "реализовано неуказанное".

Как бы то ни было со Студией, по стандарту это (по идее) ошибка. Или как минимум неопределённое поведение.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
10.09.2012, 05:57 #8
Цитата Сообщение от bgm313 Посмотреть сообщение
Прочитал, что в C пустой список параметров означает, что компилятор не проверяет аргументы и этой функции можно либо не передать ничего, либо что-то передать.
C
1
void f() {}
это определение в старом стиле (до 89 года)

C
1
void f(void) {}
вот так с 89 года надо писать

определения и объявления в старом стиле сохранены для совместимости со старыми исходниками
0
Петррр
5972 / 3409 / 337
Регистрация: 28.10.2010
Сообщений: 5,926
10.09.2012, 06:22 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
~OhMyGodSoLong~, если расширение файла *.с, то будет откомпилировано как Си (об этом кто-то на форуме говорил).

ПКМ по проекту-> Configuration Properties -> C/C++ -> Advanced -> Compile As -> Compile as C Code (/TC)
3
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
10.09.2012, 06:52 #10
Цитата Сообщение от Петррр Посмотреть сообщение
~OhMyGodSoLong~, если расширение файла *.с, то будет откомпилировано как Си (об этом кто-то на форуме говорил).

ПКМ по проекту-> Configuration Properties -> C/C++ -> Advanced -> Compile As -> Compile as C Code (/TC)

Не по теме:

случайно на спасибо нажал. В неудобном месте стоит, всегда путаю его с "цитировать".


"откомпилировано как Си" это как?
Какое отношение имеет расширение хэдера к компиляций?
Как компоновщик может создавать из разных типов объектных модулей единый исполняемый модуль?
0
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
10.09.2012, 08:35 #11
Цитата Сообщение от vendeme Посмотреть сообщение
Какое отношение имеет расширение хэдера к компиляций?
Никакого, хедеры не компилируются
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
10.09.2012, 09:01 #12
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Пока что выходит, что в С99 такие финты явно запрещены (что (), что (void) = не должно быть параметров при вызове)
Вообще, Стандарт немного неясен (по крайнем мере, для меня) по этому поводу (
6.7.6.3p14
An identifier list declares only the identifiers of the parameters of the function. An empty
list in a function declarator that is part of a definition of that function specifies that the
function has no parameters. The empty list in a function declarator that is not part of a
definition of that function specifies that no information about the number or types of the
parameters is supplied.
). Насколько я правильно понимаю, следующий код не должен компилироваться с точки зрения C99:
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int foo()
{
    return 3;
}
 
int main(void)
{
    return foo(42);
}
Однако он успешно компилируется gcc 4.7.0 с -Wall -Werror -Wextra -std=c99 -pedantic -pedantic-errors в CFLAGS. Это меня несколько смущает (в то время как флаг -Wstrict-prototypes спасает отца русской демократии)

Читал обсуждение этого вопроса на одном ресурсе, насчет чего могу предложить следующие цитаты:

That might be a good idea, but it does not have to. Calling a
function with the wrong parameter list is not a constraint violation
unless there is a prototype in scope. Add (void) to the function
definition and declaration and both will act as a prototype as well.
gcc will then warn you that they are being called incorrectly.
Т.е. обычного декларатора (независимо от того, встречается ли он в объявлении или в определении функции) компилятору недостаточно, надо добавить прототип функции (в данном случае "int foo(void);"). Тогда да, компилятор начнет ругаться. Еще цитата:

There are four things to consider:

C
1
2
3
4
int foo() { return 1; }
int foo();
int foo(void) { return 1; }
int foo(void);
All four act as declarations of the function but only 1 and 3 are also
definitions. 3 and 4 also provide a prototype whereas 1 and 2 do not.

2 says the least. As a declarator with an empty parameter list that
is *not* part of a definition is says nothing about foo's parameters.

1, 3 and 4 all say that foo has no parameters but calls to foo with a
parameter will only be diagnosed in the case of 3 and 4. A compiler
is permitted to complain about foo(42) after seeing 1, but to do so it
need to distinguish between 1 and 2 because foo(42) is *not* wrong
after seeing only 2. I don't know a compiler that does this. For one
thing, it would involve a lot of effort being put into old-style
definitions.
Вот такие дела.

А вообще, function declarators непрототипного формата уже объявлены устаревающими в C99, так что в следующих версиях стандарта, скорее всего, от них избавятся.

Цитата Сообщение от vendeme Посмотреть сообщение
Какое отношение имеет расширение хэдера к компиляций?
А откуда ты хэдеры-то взял? В цитируемом тобой сообщении про них ни слова.

Цитата Сообщение от defer Посмотреть сообщение
Никакого, хедеры не компилируются
содержимое хедеров (обработанное препроцессором) подставляется вместо соответствующих директив #include в файле, и результирующий "файл" уже компилируется
1
easybudda
Модератор
Эксперт CЭксперт С++
9699 / 5649 / 964
Регистрация: 25.07.2009
Сообщений: 10,871
10.09.2012, 13:48 #13
Цитата Сообщение от bgm313 Посмотреть сообщение
Почему тогда ругается компилятор (выдаёт более 100 ошибок) при расширение .c и вводе кода:

C
1
2
3
4
5
6
7
#include <iostream>
 
int main(){
  std::cout << 1;
  return 0;
 
}
И как бы ничего, что код на С++, а не на С? При таком подходе действительно
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Да хоть на pas.
Языки С и С++ не только расширением у файла различаются...

Ну и для наглядности:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    char * ptr = malloc(256);
    
    if ( ! ptr ) {
        perror("malloc");
        exit(1);
    }
    
    printf("Ok\n");
    free(ptr);
    return 0;
}
Код
C:\c_cpp\other>cl c_code.c
Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 15.00.30729.01
 для 80x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

c_code.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c_code.exe
c_code.obj

C:\c_cpp\other>ren c_code.c c_code.cpp

C:\c_cpp\other>cl c_code.cpp
Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 15.00.30729.01
 для 80x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

c_code.cpp
c_code.cpp(5) : error C2440: инициализация: невозможно преобразовать 'void *' в
'char *'
        Для преобразования 'void*' к указателю на тип, не являющемуся 'void', тр
ебуется явное приведение

C:\c_cpp\other>
0
Петррр
5972 / 3409 / 337
Регистрация: 28.10.2010
Сообщений: 5,926
10.09.2012, 18:43 #14
vendeme, Вы о чем? Я об этом:
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Да хоть на pas. Там есть в комплекте конпелятор Си, но его надо вызывать из консоли руками или лезть в ключи и тыкать носом, чтобы всё компилила как Си.
0
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
10.09.2012, 23:11 #15
Всегда считал, что если функция объявлена как
C
1
void f(void)
, то она не должна принимать параметров вообще, а если как
C
1
void f()
, то она может принимать переменное число параметров.
Однако, можно (по крайней мере на VS2005) передать в void f(void) различный набор параметров. Пример:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<conio.h>
 
void f(void)
{
    printf("%s","In the hell-function :)\n");
}
 
int main(void)
{
    
    f(10,20);
    f(100,200,33,44);
    getch();
    return 0;
}
Только в таком случае компилятор выдает предупреждение C4087: 'f' : declared with 'void' parameter list. Похоже на тонкий намек на undefined behaviour. Хотя могу и ошибаться.

Добавлено через 1 минуту
P.S. имел ввиду чистый Си. Как в плюсах дело обстоит - не в курсе.
0
10.09.2012, 23:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2012, 23:11
Привет! Вот еще темы с ответами:

Написать рекурсивную функцию, проверяющую, входит или не входит элемент Е в не пустой список L, состоящий из вещественных чисел - C++
Помогите решить задачу, очень нужно Написать программу в которой объявить рекурсивную функцию, проверяющую, входит или не входит...

Список параметров функции из DLL - C++
В runtime загружаю DLL'ки, вывожу список функций содержащийся в них, но так и не нашёл вариантов как экспортировать типы аргументов и...

Функция с переменным числом параметров находящая максимальный элемент в списке параметров - C++
Написать функцию с переменным числом параметров:Максимальный из элементов в списке параметров, стоящих на нечетных местах....

Функция с переменным числом параметров, как узнать кличество переданных параметров? - C++
Добрый вечер, можно не использовать int n, а каким то другим способом узнать количество переданных аргументов в функцию и адрес? int suma...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.