Вот небольшая программа:
#include <iostream>
#include <string>
#include <cstdlib>void Exit_With_Error(std::string const& error_message);
int main(){
Exit_With_Error("Error X occurred.");
return 0;
}
void Exit_With_Error(std::string const& error_message){
std::cerr << error_message << std::endl;
exit(EXIT_FAILURE);
return;
}
Как видите, функция Exit_With_Error, никогда не вернется. Я подумал, что лучше использовать атрибут, чтобы лучше проиллюстрировать это. Документация Вот, приводит меня к мысли, что это должно выглядеть так:
#include <iostream>
#include <string>
#include <cstdlib>[[noreturn]] void Exit_With_Error(std::string const& error_message);
int main(){
Exit_With_Error("Error X occurred.");
return 0;
}
[[noreturn]] void Exit_With_Error(std::string const& error_message){
std::cerr << error_message << std::endl;
exit(EXIT_FAILURE);
return;
}
Тем не менее, он не компилируется:
main.cpp:6:1: error: expected unqualified-id before ‘[’ token
main.cpp: In function ‘int main()’:
main.cpp:9:37: error: ‘Exit_With_Error’ was not declared in this scope
main.cpp: At global scope:
main.cpp:13:1: error: expected unqualified-id before ‘[’ token
Я получил это на работу, хотя!
#include <iostream>
#include <string>
#include <cstdlib>__attribute__((noreturn)) void Exit_With_Error(std::string const& error_message);
int main(){
Exit_With_Error("Error X occurred.");
return 0;
}
__attribute__((noreturn)) void Exit_With_Error(std::string const& error_message){
std::cerr << error_message << std::endl;
exit(EXIT_FAILURE);
return;
}
Мой вопрос:
Как мне заставить работать синтаксис [[attribute]]? Я компилирую с флагом c ++ 11 на gcc. Так, например,
g++ -std=c++11 -o main main.cpp
пока это не работает. У меня версия 4.7.2 компилятора.
Правильно ли работает способ, или я должен стремиться к этому более простому синтаксису?
Нет. Обобщенные атрибуты не были реализованы в GCC до версии 4.8.
Это можно увидеть здесь:
http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
http://gcc.gnu.org/gcc-4.8/cxx0x_status.html
Других решений пока нет …