Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/30: Рейтинг темы: голосов - 30, средняя оценка - 4.53
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208

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

09.09.2012, 18:10. Показов 6223. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2012, 18:10
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

определения и объявления в старом стиле сохранены для совместимости со старыми исходниками
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
10.09.2012, 06:22
Лучший ответ Сообщение было отмечено как решение

Решение

~OhMyGodSoLong~, если расширение файла *.с, то будет откомпилировано как Си (об этом кто-то на форуме говорил).

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

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

Не по теме:

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


"откомпилировано как Си" это как?
Какое отношение имеет расширение хэдера к компиляций?
Как компоновщик может создавать из разных типов объектных модулей единый исполняемый модуль?
0
 Аватар для defer
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
10.09.2012, 08:35
Цитата Сообщение от vendeme Посмотреть сообщение
Какое отношение имеет расширение хэдера к компиляций?
Никакого, хедеры не компилируются
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
10.09.2012, 09:01
Цитата Сообщение от ~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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
10.09.2012, 13:48
Цитата Сообщение от 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;
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
10.09.2012, 18:43
vendeme, Вы о чем? Я об этом:
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Да хоть на pas. Там есть в комплекте конпелятор Си, но его надо вызывать из консоли руками или лезть в ключи и тыкать носом, чтобы всё компилила как Си.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
10.09.2012, 23:11
Всегда считал, что если функция объявлена как
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.09.2012, 23:11
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru