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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Стандартная билиотека http://www.cyberforum.ru/cpp-beginners/thread649081.html
Зачем нужная функция fabs, если abs делает всё то, что делает fabs и, даже больше?
C++ Оператор switch Ниже приведены три примера (1 и 2 работают, а 3 почему-то не работает). Говорит, что пропуск инициализации? Почему тогда 1 и 2 работают, а 3 нет? //main int a = 2; switch(a){ case 1: int b; http://www.cyberforum.ru/cpp-beginners/thread649070.html
C++ Двумерный массив через указатели и его заполнение
Привет, объясните, как создать двумерный массив через указатели и заполнить его с клавиатуры? Т.е. ввести количество строк и столбцов, а потом заполнить каждый элемент. С линейным массивом разобрался, а тут до меня не доходит.
C++ Математический пример, используем if, switch
Задание: x*x Если 0<=x<=3 f(x)= { 4 В противном случае #include "stdafx.h" #include <iostream> #include <math.h>
C++ Проверить правильность задания №2 http://www.cyberforum.ru/cpp-beginners/thread649054.html
Дано трехзначное число N. Проверить, будет ли сумма его цифр четным числом. #include "stdafx.h" #include <iostream> #include <conio.h> #include <stdio.h> using namespace std; int main(int argc, char *argv)
C++ Динамическая память, указатели и ссылки Добрый день, я уже 3 месяца учу C++, но не как не могупонять как работать с указателями в C++, я весь гугл перерыл, я не могу понять что такое константный указатель, указатель на указатель, создание динамических 2,3-х мерных массивов. Я искал эти темы во многих учебниках, пытался стачало по примерм, но смысл писать код по примерам если его не понемаеш? Я смотрю в примерах, там везде... подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5759 / 3408 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.09.2012, 09:01     Пустой список параметров в c и c++
Цитата Сообщение от ~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 в файле, и результирующий "файл" уже компилируется
 
Текущее время: 07:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru