4

Я хочу, чтобы создать свое собственное предупреждение во время компиляции, а не в предварительных обработках (как я видел несколько ответов на) Допустим, мы имеем:C++, как создать свое собственное предупреждение во время компиляции

class A 
{ 
private: 
    explicit A(A const& other); 
}; 

теперь, если пользователь делает:

A first;

, а затем:

A second(first);

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

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

Помощь? Спасибо!

+0

Переключитесь на gcc и используйте __attribute __ ((предупреждение («мое сообщение»))) ;-) –

+3

Неясно, хотите ли вы получать предупреждающие сообщения или сообщения об ошибках, пожалуйста, уточните. –

+2

Странно, что ваш компилятор не ссылается на строку, в которой пользователь выполняет «второй (первый)», поскольку это попытка вызвать частную функцию. –

ответ

1

Без препроцессора, используя только стандартный C++, это нереально. Вы можете использовать static_assert, но это не предупреждение.

+0

static assert только сделает это _never_ компиляции .. Я хотел что-то делать во время компиляции, а не в препроцессоре, – Alon

2

Использование static_assert с пользователем определить сообщение вызовет сообщение об ошибке во время компиляции

class A 
{ 
private: 
    A() {} 

    explicit A(A const& /* other */) 
    { 
     static_assert(false, "You cannot use copy constructor"); 
    } 
}; 

int main() 
{ 
    A first;  
    A second(first); // compile error 
} 

Выход на LiveWorkSpace

Примечание это приведет к ошибке, а не предупреждение. Тем не менее, почти всегда лучше использовать опцию компилятора «предупреждения как ошибки» и объяснять (т. Е. Документировано с комментарием) отключить предупреждения, которые, как вы знаете, безобидны.

+0

Да, предупреждение о компиляторе хорошо .. – Alon

+0

Это совершенно бесполезно, но вы бы скорее сделали: 'A (A const &) = delete', потому что это ** идиоматический ** в C++ 11. –

+0

@ MatthieuM. Конечно, вы правы, но я понял, как настраивать сообщения компилятора в целом. – TemplateRex

Смежные вопросы