LINUX.ORG.RU

C++ шаблон булевой функции


1

1

Немогу определить bool функцию
если ставлю её перед main, ругается что argv неопределен,
а если в теле main, то ругается что там нельзя определять ф-ю
ЧЯДНТ?

(если перед)
: In function ‘bool bbbb(int)’:
: error: ‘argv’ was not declared in this scope

(если в теле)
: In function ‘int main(int, char**)’:
:14: error: a function-definition is not allowed here before ‘{’ token
:20: error: ‘bbbb’ was not declared in this scope

/* Это тестовый файл*/
#include <iostream>
using namespace std;

int i = 0;

bool aaaa;
bool bbbb (int i)
{
aaaa = ( argv[1] * argv[2] > 0 );
return aaaa;
}

int main(int argc, char *argv[])
{

bbbb (i);
cout << aaaa << endl;

return 0;
}
Ответ на: комментарий от waker

а ты кастуй в intptr_t

Зачем? Мне не нужно перемножать указатели :)

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Еще раз, перемножить указатели можно, как и поделить на ноль можно. Но это UB.

у нас с тобой разное понимание слова «можно». По моему UB это синоним «нельзя». Т.е. можно конечно, если тебя не волнует результат. Ну как нашего Царя.

emulek
()
Ответ на: комментарий от andreyu

Ага, но компилятор все равно предупреждение кинет.

сишка не кинет. И C++ не кинет с reinterpret_cast. Если ты решил отстрелить себе яйца, это твоя проблема, а не ружья.

emulek
()
Ответ на: комментарий от emulek

у нас с тобой разное понимание слова «можно».

Вероятно так.

По моему UB это синоним «нельзя».

С каких пор «неопределенное поведение» и «нельзя» стали синонимами?

Т.е. можно конечно, если тебя не волнует результат. Ну как нашего Царя.

Ну вот, перемножить можно, а результат бесполезен.

andreyu ★★★★★
()
Ответ на: комментарий от emulek

сишка не кинет. И C++ не кинет с reinterpret_cast. Если ты решил отстрелить себе яйца, это твоя проблема, а не ружья.

Вот сишка и кинула предупреждение:

$ make t
cc     t.c   -o t
t.c: In function ‘main’:
t.c:6:18: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
t.c:6:32: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]

Тут приведение к инту сделано.

$ gcc --version
gcc (Gentoo 4.7.3-r1 p1.4, pie-0.5.5) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
andreyu ★★★★★
()
Ответ на: комментарий от andreyu

ничего оно не кидает даже с -Wall

int main(int argc, char *argv[])
{
·   static int a[]={1,2,3};
·   static int b[]={3,4,5};
·   return (int)a+(int)b;
}

gcc (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая 
коммерческую ценность и применимость для каких-либо целей.

emulek
()
Ответ на: комментарий от emulek

у нас с тобой разное понимание слова «можно».

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

Pinkbyte ★★★★★
()
Ответ на: комментарий от emulek

ничего оно не кидает даже с -Wall

Ну да, это я придумал выхлоп компилятора. Вот выхлоп компилятора на вашем коде:

$ make t
cc     t.c   -o t
t.c: In function ‘main’:
t.c:5:12: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
t.c:5:19: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
andreyu ★★★★★
()
Последнее исправление: andreyu (всего исправлений: 1)
Ответ на: комментарий от emulek

что такое старьё юзаешь?

Я использую стабильную версию, а 4.8.2 помечен как тестовый.

andreyu ★★★★★
()
Ответ на: комментарий от Pinkbyte

Имеется в виду «можно технически».

«технически» это тоже самое, что складывать «солёное» и «сладкое» как int'ы. Это тоже «можно», т.к. у строки тоже есть численное представление. Это тоже несколько байт, как и указатель.

emulek
()
Ответ на: комментарий от andreyu

а, ну это у вас 64х битный указатель и 32х битный int. А у меня тут 32х битный указатель, потому и без предупреждений. Кастуй в int64_t, и всё будет хорошо.

emulek
()
Ответ на: комментарий от emulek

ну дык и какое отношение имеет это подтверждение к нашему спору? При чём тут размер вашего int'а?

Вы потеряли суть вашего же возмущения?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

нет вы. Я утверждал, что указатель можно без предупреждений скастовать в подходящий int. Я не говорил, что этот int обязательно должен быть 32х битный. long это тоже long int. И предупреждение у вас появляется не из-за каста указателя, а из-за разницы в размерах. Это совсем другой вопрос.

emulek
()
Ответ на: комментарий от emulek

Я утверждал, что указатель можно без предупреждений скастовать в подходящий int.

Да неужели?

И предупреждение у вас появляется не из-за каста указателя, а из-за разницы в размерах.

Вы одолели перевод выхлопа компилятора?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

я утверждал, что нельзя складывать указатели, потому что получается ☣(UB). Причём хреновая ☣, которую даже компилятор не видит(если кастовать). А вот вы зачем влезли, с вашим предупреждением, о неправильном размере?

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.