Подтвердить что ты не робот

Как скомпилировать С++ с поддержкой С++ 11 в Mac Terminal

Я хотел скомпилировать исходный код С++ 11 в Mac Terminal, но не удалось. Я пробовал g++ -std=c++11, g++ -std=c++0x, g++ -std=gnu++11 и g++ -std=gnu++0x, но ничего не работало. Терминал всегда читается unrecognized command line option. Тем не менее, g++ -std=gnu и такие вещи отлично работали (конечно, исходный код С++ 11 не мог пройти).

Какую опцию я должен использовать для включения поддержки С++ 11?

Кстати, инструмент командной строки, который я использую, установлен в Xcode, и я уверен, что они обновлены.

4b9b3361

Ответ 1

Как указывали другие, вы должны использовать clang++, а не g++. Кроме того, вы должны использовать библиотеку libС++ вместо стандартного libstdС++; Включенная версия libstdС++ довольно старая и поэтому не включает в себя возможности библиотеки С++ 11.

clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

Если вы не установили инструменты командной строки для Xcode, вы можете запустить компилятор и другие инструменты, не делая этого, используя инструмент xcrun.

xcrun clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

Также, если есть специальное предупреждение, которое вы хотите отключить, вы можете передать дополнительные компиляторы для этого. В конце предупреждающих сообщений отображается наиболее конкретный флаг, который будет включать предупреждение. Чтобы отключить это предупреждение, вы добавляете no- к имени предупреждения.

Например, вам, вероятно, не нужны предупреждения совместимости С++ 98. В конце этих предупреждений он показывает флаг -Wc++98-compat и отключает их, вы передаете -Wno-c++98-compat.

Ответ 2

XCode использует clang и clang++ при компиляции, а не g++ (если вы не настроили какие-либо вещи). Вместо этого попробуйте:

$ cat t.cpp
#include <iostream>

int main()
{
    int* p = nullptr;
    std::cout << p << std::endl;
}
$ clang++ -std=c++11 -stdlib=libc++ t.cpp
$ ./a.out 
0x0

Спасибо bames53 за то, что указали, что я оставил -stdlib=libc++.

Если вы хотите использовать некоторые расширения GNU (а также использовать С++ 11), вы можете использовать -std=gnu++11 вместо -std=c++11, который включит режим С++ 11, а также включит расширения GNU.