Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
09.09.2012, 18:10     Пустой список параметров в c и c++ #1
Работаю в visual studio 2010. Прочитал, что в C пустой список параметров означает, что компилятор не проверяет аргументы и этой функции можно либо не передать ничего, либо что-то передать.

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

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

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

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

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

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

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

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

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

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

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

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

Не по теме:

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


"откомпилировано как Си" это как?
Какое отношение имеет расширение хэдера к компиляций?
Как компоновщик может создавать из разных типов объектных модулей единый исполняемый модуль?
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
10.09.2012, 08:35     Пустой список параметров в c и c++ #11
Цитата Сообщение от vendeme Посмотреть сообщение
Какое отношение имеет расширение хэдера к компиляций?
Никакого, хедеры не компилируются
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.09.2012, 09:01     Пустой список параметров в c и c++ #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 в файле, и результирующий "файл" уже компилируется
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.09.2012, 13:48     Пустой список параметров в c и c++ #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>
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
10.09.2012, 18:43     Пустой список параметров в c и c++ #14
vendeme, Вы о чем? Я об этом:
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Да хоть на pas. Там есть в комплекте конпелятор Си, но его надо вызывать из консоли руками или лезть в ключи и тыкать носом, чтобы всё компилила как Си.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2012, 23:11     Пустой список параметров в c и c++
Еще ссылки по теме:

STL list. В изначально пустой список вставить 100 элементов путем вставки в случайную позицию C++
Список формальных параметров в функции C++
C++ Как понять список формальных параметров функции Bar?

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

Или воспользуйтесь поиском по форуму:
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 3
10.09.2012, 23:11     Пустой список параметров в c и c++ #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. имел ввиду чистый Си. Как в плюсах дело обстоит - не в курсе.
Yandex
Объявления
10.09.2012, 23:11     Пустой список параметров в c и c++
Ответ Создать тему
Опции темы

Текущее время: 04:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru