LINUX.ORG.RU

Вопросик по C++ NULL

 ,


0

1

Я тут изучаю с++ ) Не могу понять как мне проверить что объект создан?

Process{
  public:
    Process(const char* cmd_){}
  ...
}


далее я объявляю
Process ffplay=NULL;

if(ffplay){} //ошибка
//conditional expression of type 'Process' is illegal

if(ffplay != NULL && !ffplay.isClosed()){} //ошибка
//binary '!=': no operator found which takes a left-hand operand of type 'Process' (or there is no acceptable conversion)



ffplay ведь изначально NULL(=0)

★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Не любит «играться с ключами компиляции, которые к тому же не закреплены стандартом самого языка», бедолага, вестимо, собирает свой код с -O0.

Еще один супер психолог. Ребята, ну не пытайтесь вы угадывать, что у другого человека на уме, и что он делает. Вы не психологи, этому нужно учиться и опыт иметь соответствующий. Специально для тебя я посмотрел один из своих проектов вот:

CXX_FLAGS = -O3

Я действительно не играюсь с флагами компиляции в 90% случаев, в основном их заполняет CMake и значение выше - это значение по умолчанию.

Хреново быть тобой

У меня все отлично, и с работой и дома. Поэтому отлично быть мною. Можно завидовать. Но не нужно, лучше построй свою жизнь так, чтобы не хотелось чужую обсуждать.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 2)
Ответ на: комментарий от Siborgium

Вывод диагностических сообщений включен по крайней мере в gcc и clang. В MSVC (19.28.29333.0) у меня ничего не выводится (у меня Qt Creator + MSVC (собираю через CMake), если собирать через консоль PowerShell и ручной вызов CMake, то тоже ничего не выводится). В любом случае, неужели ты будешь утверждать, что лучше заморачиваться с флагами, вместо того чтобы иметь нормальный nullptr?

Вот сборка в PowerShell:

PS C:\libs_build\build_test> cmake -G "Visual Studio 16 2019" -A x64 ..\test\
-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.17763.
-- The CXX compiler identification is MSVC 19.28.29333.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.28.29333/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/libs_build/build_test
PS C:\libs_build\build_test> cmake --build . --config release --verbose --parallel 4
Microsoft (R) Build Engine версии 16.8.1+bd2ea1e3c для .NET Framework
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

Сборка начата 30.11.2020 20:24:19.
     1>Проект "C:\libs_build\build_test\ALL_BUILD.vcxproj" в узле 1 (целевые объекты по умолчанию).
     1>Проект "C:\libs_build\build_test\ALL_BUILD.vcxproj" (1) выполняет сборку "C:\libs_build\build_test\ZERO_CHECK.vcxproj" (2) в узле 1 (целевые объекты по умолчанию).
     2>PrepareForBuild:
         Создание каталога "x64\release\ZERO_CHECK\".
         Создание каталога "x64\release\ZERO_CHECK\ZERO_CHECK.tlog\".
       InitializeBuildStatus:
         Создание "x64\release\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild", так как было задано "AlwaysCreate".
       CustomBuild:
         Checking Build System
       FinalizeBuildStatus:
         Файл "x64\release\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild" удаляется.
         Обращение к "x64\release\ZERO_CHECK\ZERO_CHECK.tlog\ZERO_CHECK.lastbuildstate".
     2>Сборка проекта "C:\libs_build\build_test\ZERO_CHECK.vcxproj" завершена (целевые объекты по умолчанию).
     1>Проект "C:\libs_build\build_test\ALL_BUILD.vcxproj" (1) выполняет сборку "C:\libs_build\build_test\test.vcxproj" (3) в узле 1 (целевые объекты по умолчанию).
     3>PrepareForBuild:
         Создание каталога "test.dir\Release\".
         Создание каталога "C:\libs_build\build_test\Release\".
         Создание каталога "test.dir\Release\test.tlog\".
       InitializeBuildStatus:
         Создание "test.dir\Release\test.tlog\unsuccessfulbuild", так как было задано "AlwaysCreate".
       CustomBuild:
         Building Custom Rule C:/libs_build/test/CMakeLists.txt
       ClCompile:
         C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\HostX64\x64\CL.exe /c /nologo /W3 /WX- /diagnostics:column /O2 /Ob2 /D WIN32 /D _WINDOWS /D NDEBUG /D "CMAKE_INTDIR=\"Release\"" /D _MBCS /Gm- /EHsc /MD /GS /fp:precise
         /Zc:wchar_t /Zc:forScope /Zc:inline /GR /Fo"test.dir\Release\\" /Fd"test.dir\Release\vc142.pdb" /Gd /TP /errorReport:queue C:\libs_build\test\main.cpp
         main.cpp
       Link:
         C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\HostX64\x64\link.exe /ERRORREPORT:QUEUE /OUT:"C:\libs_build\build_test\Release\test.exe" /INCREMENTAL:NO /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.l
         ib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:"C:/libs_build/build_test/Release/test.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/libs_build/b
         uild_test/Release/test.lib" /MACHINE:X64  /machine:x64 test.dir\Release\main.obj
         test.vcxproj -> C:\libs_build\build_test\Release\test.exe
       FinalizeBuildStatus:
         Файл "test.dir\Release\test.tlog\unsuccessfulbuild" удаляется.
         Обращение к "test.dir\Release\test.tlog\test.lastbuildstate".
     3>Сборка проекта "C:\libs_build\build_test\test.vcxproj" завершена (целевые объекты по умолчанию).
     1>PrepareForBuild:
         Создание каталога "x64\release\ALL_BUILD\".
         Создание каталога "x64\release\ALL_BUILD\ALL_BUILD.tlog\".
       InitializeBuildStatus:
         Создание "x64\release\ALL_BUILD\ALL_BUILD.tlog\unsuccessfulbuild", так как было задано "AlwaysCreate".
       CustomBuild:
         Building Custom Rule C:/libs_build/test/CMakeLists.txt
       FinalizeBuildStatus:
         Файл "x64\release\ALL_BUILD\ALL_BUILD.tlog\unsuccessfulbuild" удаляется.
         Обращение к "x64\release\ALL_BUILD\ALL_BUILD.tlog\ALL_BUILD.lastbuildstate".
     1>Сборка проекта "C:\libs_build\build_test\ALL_BUILD.vcxproj" завершена (целевые объекты по умолчанию).

Сборка успешно завершена.
    Предупреждений: 0
    Ошибок: 0

Прошло времени 00:00:00.98

При этом CMakeLists.txt самый дефолтный:

cmake_minimum_required(VERSION 3.5)

project(test LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(test main.cpp)

Ну и main.cpp:

#include <iostream>

int main() {
  int i = NULL;
  int j{};
  
  if (j == NULL) {
    // Do something
  }
}
rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 7)
Ответ на: комментарий от rumgot

В любом случае, неужели ты будешь утверждать, что лучше заморачиваться с флагами, вместо того чтобы иметь нормальный nullptr?

Одно другому не мешает. А кресты собирать без -Wall -Wextra – буквально искать проблем.

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

Одно другому не мешает. А кресты собирать без -Wall -Wextra – буквально искать проблем.

ну там и другие флажки интересные есть. у меня такие флаги всегда «-Wall» «-Wextra» «-pedantic» «-pedantic-errors» «-Wold-style-cast» «-Wfloat-equal» «-Wunreachable-code» «-Wmissing-include-dirs» «-Wpointer-arith» «-Wswitch»

хотя возможно некотрые из них входят в -wall -wextra

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

Есть и другие, я привел лишь минимальный набор.

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

Просто предупреждения - это фигня, потому как кто-кто на проекте да возьмет да и проигнорирует их, решение о том, игнорировать ли предупреждения, лучше не давать принимать человеку. Интересными они становятся с флагом -Werror. Так я вот задавал выше вопрос. Но никто не ответил: в MSVC есть флаги -Werror и-Wnull-arithmetic` или аналоги?

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

Ну вообще, т.к. ты пишешь в 2020ом году лучше поменяй Process* на unique_ptr<Process> или shared_ptr<Process> тогда тебе не придется следить за тем, вызвал ты delete или нет.

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

В MSVC есть -Werror, это /WX

но вот проверок про макрос NULL в MSVC нет :(

Создал в их багзилле предложение об этом, будет полезно для чистого C проекта: https://developercommunity.visualstudio.com/idea/1273607/add-warnings-about-null-usage.html

Но в MSVC есть другие предупреждения…

И можно собирать несколькими компиляторами проект…

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 2)
Ответ на: комментарий от fsb4000

То-то и оно. Чтобы тут у всех присутствующих не сложилось ложное мнение: я не утверждаю, что-то использование флагов компилятора для проверок - это плохо. Я утверждаю, что-то проверки на уровне языка ЛУЧШЕ чем проверки на уровне флагом компилятора.

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

Дело не в моде, а в том, чтобы переложить на компилятор больше контроля типов.

Да, я выше уже согласился с тем, что при перегрузке функций это может быть безопаснее.

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

оба не нужны в данном случае и нужно стараться избегать этих сишных проверок на NULL

Да, в данном случае не нужны. Но если бы речь шла не об объекте на стеке, а об указателе на объект в куче, то такая проверка была бы необходима.

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

Тогда просто создание объекта на стеке и всё. Либо умные указатели типа unique_ptr<Process>(new Process(«ffplay»))

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