Ten en cuenta que no es lo mismo comparar si el objeto contiene una cadena "0" que si el contenido es 0. Puedes chequear el ejemplo de cplusplus sobre el método compare:
// comparing apples with apples
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str1 ("green apple");
string str2 ("red apple");
if (str1.compare(str2) != 0)
cout << str1 << " is not " << str2 << "\n";
if (str1.compare(6,5,"apple") == 0)
cout << "still, " << str1 << " is an apple\n";
if (str2.compare(str2.size()-5,5,"apple") == 0)
cout << "and " << str2 << " is also an apple\n";
if (str1.compare(6,5,str2,4,5) == 0)
cout << "therefore, both are apples\n";
return 0;
}
Primero tenes que decidir si estas tratando de comparar si la cadena es o no NULL o si estas tratando de comparar si el contenido de la cadena es o no 0. Definido eso puedes proceder con la forma que corresponda.
A simple vista no es necesario usar c_str en el ejemplo que expones, pero si lo fuese, lo estas haciendo mal por lo anteriormente mencionado.
Cuidado con meter casteos "para ver si funciona" sin saber realmente el objetivo del casteo, porque a veces el asunto podria parecer que funciona pero no.
Por lo pronto si te quieres sacar la duda puedes poner un breakpoint en el if e iniciar la depuración (debug) para comprobar que contiene "macs" y que te devuelve el método compare y demás. La mayoría de los IDEs tienen opciones para poder visualizar el contenido de las variables en forma individual durante la ejecución del programa, así que busca cual es la forma de hacerlo en tu IDE. Generalmente encontraras esa opción como "Expressions" o "Watch" o algo similar.
Saludos
PD: He visto que haces mucho doble post y hasta a veces triple post. Trata de usar el botón modificar.