Рассмотрим следующий фрагмент кода (обратите внимание на комментарий):
#include <iostream>
int main()
{
int x = 1; // <-- Why??/
x += 1;
std::cout << x << std::endl;
}
Для компиляции этой программы я использую компилятор GNU C ++ g++
:
$ g++ --version // g++ (Ubuntu 6.5.0-1ubuntu1~16.04) 6.5.0 20181026
Теперь, при компиляции для C ++ 11 и C ++ 17 , я получаю разные результаты (и предупреждения).
Для C ++ 11, g++ -std=c++11 trigraph.cpp -Wall
:
trigraph.cpp:5:26: warning: trigraph ??/ converted to \ [-Wtrigraphs]
int x = 1; // <-- Why??/
trigraph.cpp:5:16: warning: multi-line comment [-Wcomment]
int x = 1; // <-- Why??/
^
$ ./a.out
1
Для C ++ 17, g++ -std=c++17 trigraph.cpp -Wall
:
trigraph.cpp:5:26: warning: trigraph ??/ ignored, use -trigraphs to enable [-Wtrigraphs]
int x = 1; // <-- Why??/
$ ./a.out
2
Прочитав немного о триграфах, я понимаю, что они были удалены в C ++ 17, поэтому игнорируются компилятором, как показано в примере выше. Однако, в случае C ++ 11, даже когда он находится в комментарии, он был преобразован!
Теперь я вижу, как это повлияет на код, если, например, триграф был в символьной строке. Но в этом примере не следует ли его игнорировать, поскольку он находится в комментарии?
После удаления косой черты ("/") из комментария все предупреждения исчезли. У меня вопрос, что именно здесь произошло? Почему вывод отличается?