Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Настройки компилятора... / 18 сообщений из 18, страница 1 из 1
05.12.2013, 11:06
    #38489904
max950
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
Здравствуйте,
Заранее прошу прощения за "ламерскую" постановку вопроса.
Надеюсь смогу объяснить суть проблемы.

Пытаюсь программировать на VC++.
Возник следующий вопрос:

Имеем следующую конструкцию:

Код: plaintext
1.
2.
3.
4.
func1(){
      func2();
      return;
}



т.е. из одной функции вызываю другую функцию.

Если я меняю схему следующим образом:

Код: plaintext
1.
2.
3.
4.
func1(){
      return;
      func2();      
}



т.е. выхожу из функции func1 до вызова func2, то при компилировании код функции func2 не включается в конечную программу.
Это видно по конечному размеру программы.
Если ли же сделать следующим образом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int val;
val = 1;
func1(){
      if (val = 1){
         return;
      }
      else{
         func2();
      }      
}



то код func2 включается компилятором в конечную программу.
Вопрос следующий: понятно, что при таком значении переменной val, программа всегда будет выходить из func1 до вызова функции func2. Возможно ли задать каким либо образом настройку компилятора, чтобы при такой однозначности он не включал код функции func2?

Спасибо.
...
Рейтинг: 0 / 0
05.12.2013, 11:57
    #38490009
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
//#define func2_enable

#ifdef func2_enable
func2()
{
    //тело функции
            
}
#endif


func1()
{
    #ifdef func2_enable
        func2();
    #endif
    return;
}
...
Рейтинг: 0 / 0
05.12.2013, 14:16
    #38490311
max950
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
Спасибо.
...
Рейтинг: 0 / 0
05.12.2013, 14:17
    #38490313
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
m_Sla,

+1, надо делать препроцессором.

Параметры компиляции может и можно подобрать, но работать это будет только на данном конкретном компиляторе...
...
Рейтинг: 0 / 0
06.12.2013, 05:51
    #38491197
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
max950
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int val;
val = 1;
func1(){
      if (val = 1){
         return;
      }
      else{
         func2();
      }      
}



А ты уверен что не хотел написать
Код: plaintext
1.
    if (val == 1){


? Я вот привыкши к VB с полпинка такую ошибку налепить могу.
И совсем непонятно чему будет равно выражение в if так как ты это записал.
...
Рейтинг: 0 / 0
06.12.2013, 10:18
    #38491367
_Прохожий_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
Дмитрий77И совсем непонятно чему будет равно выражение в if так как ты это записал.

Компилятор такую конструкцию представит равнозначно следущему:

Код: plaintext
1.
2.
3.
4.
5.
6.
val = 1;

if (val)
{
......
}



Т.е. присвоит переменной значение и проверит условие.
Ошибка распространенная, поэтому хороший тон писать так:

Код: plaintext
1.
2.
3.
4.
if (1 == val)
{
......
}



В случае
Код: plaintext
1.
2.
3.
4.
if (1 = val)
{
......
}



будет ошибка компиляции
...
Рейтинг: 0 / 0
06.12.2013, 11:59
    #38491501
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
_Прохожий_Ошибка распространенная, поэтому хороший тон писать так:
Код: plaintext
1.
2.
3.
4.
if (1 == val)
{
......
}

зато читать это угробище совершенно невозможно, аж глаза болят.
Хороший компилятор должен выдавать варнинг на if( val = 1 ), а хорошим тоном является устанавливать крыжик "считать предупреждения как ошибки" и максимальный уровень предупреждений.
...
Рейтинг: 0 / 0
06.12.2013, 12:29
    #38491553
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
Ошибка распространенная, поэтому хороший тон писать так:

if (1 == val )


Это дебилизм, а не хороший стиль.

Если у тебя не хватает, чтобы заставить свой мозг отличать присваивание от сравнения, то по-моему в программировании тебе делать нечего.
И чем признаваться публично всем в этом, лучше уж один раз в жизни сделать таки ошибку и влепить присваивание вместо сравнения, зато на всю оставшуюся жизнь запомнишь и уже никогда такую ошибку не сделаешь.
...
Рейтинг: 0 / 0
06.12.2013, 13:42
    #38491709
_Прохожий_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
MasterZivЭто дебилизм, а не хороший стиль.


Данный "Condition format" рекомендован еще в "C Coding Standard" - "Always put the constant on the left hand side of an equality/inequality comparison." И данное правило вошло в стандарты не только С/С++.
Можете называть авторов дибилами и меня причислять к их компании. Лично я сочту за честь с этими людьми рядом постоять.
А что вас так собственно возбудило? Вот уж не думал, что это старое правило, старее чем наверное любой из присутствующих здесь, может кого-то удивить или быть новым, кроме только изучающих язык.
...
Рейтинг: 0 / 0
06.12.2013, 13:52
    #38491735
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
_Прохожий_MasterZivЭто дебилизм, а не хороший стиль.


Данный "Condition format" рекомендован еще в "C Coding Standard" - "Always put the constant on the left hand side of an equality/inequality comparison." И данное правило вошло в стандарты не только С/С++.


Это ты путаешь coding conventions со стандартами. Стандарты незыблемы и обязательны к применению, конвеншены -- дело вкуса.
Я кстати ни в одном из conventions компаний где я работал такого правила не видел.

_Прохожий_Можете называть авторов дибилами и меня причислять к их компании. Лично я сочту за честь с этими людьми рядом постоять.
А что вас так собственно возбудило? Вот уж не думал, что это старое правило, старее чем наверное любой из присутствующих здесь, может кого-то удивить или быть новым, кроме только изучающих язык.

Да, назову. Когда я пишу

Код: plaintext
1.
2.
3.
4.
if (val == PI)
{
......
}




я VAL сравниваю с чем-то.

Когда я читаю

Код: plaintext
1.
2.
3.
4.
if (PI ==  ... )
{
......
}



я сразу думаю -- блин, PI -- константа, на кой хрен её с чем-то сравнивать ? это константа!

К тому же это дурацкое правило работает только если у тебя один из операндов сравнения -- rvalue.
Если lvalue оба -- всё, правило бесполезно.
Так на кой ?
...
Рейтинг: 0 / 0
06.12.2013, 14:12
    #38491794
_Прохожий_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
MasterZivТак на кой ?

Защита от опечатки и лучшая читабельность кода, т.к. сразу видна константа с которой сравнивается выражение. В случае большой длины последнего, это действительно удобнее.
...
Рейтинг: 0 / 0
06.12.2013, 17:51
    #38492208
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
_Прохожий_MasterZivТак на кой ?

Защита от опечатки и лучшая читабельность кода, т.к. сразу видна константа с которой сравнивается выражение. В случае большой длины последнего, это действительно удобнее.

Я же говорю, БЕЗ константы смысл сразу же теряется.
...
Рейтинг: 0 / 0
06.12.2013, 19:57
    #38492352
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
_Прохожий_Защита от опечатки и лучшая читабельность кода, т.к. сразу видна константа с которой сравнивается выражение. В случае большой длины последнего, это действительно удобнее.
Так может не делать громадных условий, чтобы видеть код целиком?

Вообще это один из самых дурацких пунктов в стилях кодирования, поскольку никакой 100%-й гарантии он не дает, при том что меняет естественный поток кода. А учитывая что написание кода составляет мизерную долю по сравнению с его чтением и эта разница растет со временем жизни проекта, то данное правило только ухудшает код.

Не говоря уже о том, что я например не помню уже когда я в последний раз допускал такую опечатку, как = вместо ==. Несколько лет точно.
...
Рейтинг: 0 / 0
06.12.2013, 23:35
    #38492487
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
Все-го то случайно зашел и указал человеку на очевидную ошибку-описку (чего из вас кстати никто не заметил).
И какой резонанс....
MasterZivИ чем признаваться публично всем в этом, ...Надеюсь не в мой огород камень?

Конечно если вы постоянно пишите на плюсах, вы таких ляпов делать не будете.
А на VB этот код будет:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim val as Long

Sub func1()
  val = 1

  If val = 1 Then
  Else
    func2
  EndIf
End Sub


И естественно если я месяцами сижу в VB и раз в полгода чего-то пишу-корректирую на C++, то
я могу случайно и про == забыть, и про скобки, и про ;
Ну, компилятор выдаст ошибку или предупреждение, я исправлю.

А писать 1==val, ну как-то некрасиво на мой взгляд.
...
Рейтинг: 0 / 0
07.12.2013, 02:51
    #38492554
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
Дмитрий77,

Про вас вообще не шла речь, все кроме одного с вами согласны.
А этого одного закидаем шапками :)
...
Рейтинг: 0 / 0
07.12.2013, 13:05
    #38492641
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
Anatoly Moskovsky_Прохожий_Защита от опечатки и лучшая читабельность кода, т.к. сразу видна константа с которой сравнивается выражение. В случае большой длины последнего, это действительно удобнее.
Так может не делать громадных условий, чтобы видеть код целиком?

Вообще это один из самых дурацких пунктов в стилях кодирования, поскольку никакой 100%-й гарантии он не дает, при том что меняет естественный поток кода. А учитывая что написание кода составляет мизерную долю по сравнению с его чтением и эта разница растет со временем жизни проекта, то данное правило только ухудшает код.

Не говоря уже о том, что я например не помню уже когда я в последний раз допускал такую опечатку, как = вместо ==. Несколько лет точно.

Ребята, вы не представляете, на сколько я рад, что вижу здесь единомышленников.
А то надоело маргиналом быть.
...
Рейтинг: 0 / 0
07.12.2013, 13:08
    #38492642
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
Дмитрий77
А писать 1==val, ну как-то некрасиво на мой взгляд.

Значит, не в твой огород камень.
...
Рейтинг: 0 / 0
09.12.2013, 15:12
    #38494178
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Настройки компилятора...
MasterZivА то надоело маргиналом быть.маргиналы пишут 1 == val, мы не из таких )))
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Настройки компилятора... / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]