2012-06-21 4 views
8

У меня есть основная программа, которая сравнивает две строки:Почему strcmp неизвестен clang?

#include <string> 
#include <iostream> 

using namespace std; 

int main (int argc, char *argv[]) { 
    if(strcmp (argv[0],"./test") != 0) { 
    cout << "not equal" << endl; 
    } else { 
    cout << "equal" << endl; 
    } 
    return 0; 
} 

он компилирует с GCC, но не с лязгом:

> clang -o test test_clang.cpp 
test_clang.cpp:7:6: error: use of undeclared identifier 'strcmp' 
    if(strcmp (argv[0],"./test") != 0) { 
    ^
1 error generated. 

Почему не компилировать с лязгом?

EDIT: Люди становятся суровыми при переполнении стека, вплоть до того, что я не решаюсь отправить вопрос. Вышеприведенный вопрос имеет простой ответ, хорошо, но нормально ли голосовать на голосование (дважды в первую минуту!), Потому что у них есть простой, но не очевидный ответ?

+0

У меня нет ни малейшего представления, почему люди отказались от этого. Это четко указано и действительный вопрос. – aschepler

+0

«Этот вопрос не показывает никаких исследований». Первый хит в Google для «strcmp» имеет пример кода с '#include ' (который также является допустимым решением). Минимальные исследования ответили бы на этот вопрос. Вот почему я отказался от этого. Тривиальные вопросы уменьшают ценность этого сайта. –

+2

Создание минимального примера и сравнение результатов с двумя компиляторами - это исследовательская работа. – aschepler

ответ

10

Использование

#include <string.h> 

или

#include <cstring> 

вместо

#include <string> 

строка заголовка для станд :: строки из C++. string.h есть для C нуль завершено char * струны. cstring как string.h, но для C++.

Причина, по которой он работал с gcc, - это, вероятно, разные настройки уровня предупреждения/ошибки. Можно скомпилировать код без #include заголовка и с объявлением strcmp. Компилятор не сможет выполнять проверку типов, но символ все еще разрешается компоновщиком.

Вы также можете избежать использование зЬгстра полностью и написать

#include <string> 
#include <iostream> 

int main (int argc, char *argv[]) { 
    std::string command = argv[0]; 

    if(command != "./test") { 
    std::cout << "not equal" << endl; 
    } else { 
    std::cout << "equal" << endl; 
    } 
    return 0; 
} 

Использование зОго :: строки на одной стороне сравнения приведут к «./test» строки, которая будет преобразован в станде :: строку а также сравнение будет выполняться оператором == из класса std :: string.

+1

'string.h' является заголовком C; Правильный заголовок C++ - 'cstring', поскольку он хранит все в' namespace std'. – Griwes

+0

@Griwes ОК, приятно знать. Кажется, нет никакого недостатка в использовании string.h даже в C++. –

+0

Я принимаю этот ответ как принятый, потому что он дает объяснения, которые я нашел интересными. – Barth

10

Вы не включая правильный файл заголовок

#include <cstring> 
3

Вы должны включить <cstring>. <string> - это заголовок для строк C++.

5

Вы должны #include <cstring> (или, возможно, #include <string.h>.)

Многие компиляторы включают дополнительные стандартные заголовки, когда вы включаете другой. Стандарт позволяет это; вы несете ответственность за использование заголовков, которые гарантируют объявления для использования, а не только заголовки, которые имеют объявления для вашего компилятора.

+0

'string.h' является заголовком C; только правильный заголовок C++ - 'cstring', поскольку он хранит все в' namespace std'. – Griwes

+0

@DaveS, любое доказательство? Я не могу найти ничего о том, что они устарели в стандарте. – Griwes

+0

@Griwes: Ooops. Я полностью неправильно читаю раздел. Я удалил комментарий. –

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