2015-11-17 2 views
2
struct MyClass 
{ 
    operator const char*() 
    { 
     return "hello"; 
    } 
}; 

int main() 
{ 
    MyClass obj; 
    std::cout << obj; // ok 
    printf("%s\n", obj); // Crash 
} 

Почему объект operator const char* не может быть автоматически преобразован в const char* string в printf для отображения %s?Используйте `оператор Const символ *` в Printf

Это просто потому, что в printf-подобных функциях нет типа, и %s ожидает только массив символов с терминалом 0?

+2

В теге 'C' должен быть светящийся знак. 'C! = C++' – Haris

+0

ОК, я удалил его –

+0

Нет никаких трудностей, просто шутка. – Haris

ответ

5

Почему? Из-за ограничений на переменные параметры в C++: у них практически нет типа, вы можете думать о них как void * (но это не так).

Так зная, что компилятор понятия не имеет, что вы думаете, что это должна быть строка. Вполне может потребоваться целое число, или двойной или другой объект. Или просто сам, который выбирает компилятор.

+0

Но '% s' уже дает подсказку, чтобы он мог рассматривать' void * 'как' const char * '? –

+1

Нет, это не так, какие функции выполняются во время выполнения, не имеет никакого значения для компилятора или определения языка. – Blindy

+0

Итак, преобразование типа класса выполняется во время компиляции, но компилятор не знает, какой тип он должен преобразовать в 'printf'. –

2

Когда вы звоните printf с:

printf("%s\n", obj); 

компилятор не использует функцию автоматического преобразования для преобразования obj в char const*. obj передается по printf по значению и printf пытается оценить это значение, как если бы оно было char const*. Как следствие, ваша программа демонстрирует неопределенное поведение. Вам нужно будет явно указать obj на char const*, чтобы ваша программа вела себя предсказуемо.

printf("%s\n", (char const*)obj); 

Если включить уровни предупреждения в вашем компиляторе, вы, вероятно, увидеть что-то, чтобы указать, что с помощью obj в этом printf вызова не является правильным. С g++ -Wall, я получаю:

socc.cc:16:23: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘MyClass’ [-Wformat=] 
    printf("%s\n", obj); // Crash 
+0

Да, я видел предупреждение на VS2015. –

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