Почему заголовочный файл работает в Windows, а не в Mac & Linux? (Strrev) - PullRequest
0 голосов
/ 02 мая 2018

Я изучаю работу над cstring внутри кода C ++ . Одна из широко используемых функций - strrev().

Но я обнаружил, что эта функция считается неопределенной в Mac & Linux, даже если я включил заголовочный файл <cstring> или <string.h>.

Screenshot of the error on my computer

Однако эта функция отлично работает в Windows.

(я знаю, что могу сам определить функцию как решение, представленное здесь strrev, недоступный в Linux )

Это может быть очень наивный вопрос, но не должны ли определения заголовочных файлов быть одинаковыми на разных платформах? или у каждой платформы свое определение файла заголовка?

Еще одна странная вещь, которую я не нашел strrev() в описании файла заголовка <cstring> ( описание файла заголовка cstring ), но если я не включил этот файл заголовка в Windows Я получаю ошибку, и ошибка устраняется, когда я ее включаю.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Это решение, зависящее от реализации, для включения определенных функций, отличных от стандартных.

Однако в C ++ вы можете использовать std :: reverse из заголовка <algorithm> для обращения строки.

Вот пример:

#include <iostream>
#include <algorithm>

int main()
{
    char s[] = "Hello World!";

    std::reverse( std::begin(s), std::end(s) );

    for ( const auto& i : s )
    {
        std::cout << i;
    }

    return 0; 
}

Выходная строка:

!dlroW olleH
0 голосов
/ 21 июня 2018

вот ссылка, где вы найдете список функций и классов, которые должны быть в заголовке согласно стандарту: http://www.cplusplus.com/reference/

Что касается вопроса о самом заголовке, стандарт C ++ предлагает не один заголовок в форме, а список того, что требуется.

И определения в заголовках могут даже различаться для одного и того же компилятора, от одной цели к другой (32 или 64 бита и т. Д.). Например, если вы проверяете заголовок iostream для GCC, он включает 3 файла:

#include <bits/c++config.h>
#include <ostream>
#include <istream>

заголовок в каталоге битов / обычно варьируется от одной цели к другой, и вы напрямую не включаете его в свое собственное приложение.

0 голосов
/ 02 мая 2018

Одной из часто используемых функций является strrev().

На самом деле, кроме как в программировании, я не могу придумать любой жизнеспособную причину, по которой strrev() было бы полезно. Я не думаю, что мне понадобился такой зверь за всю мою многолетнюю карьеру: -)

Причина, по которой он не определен на некоторых платформах, заключается в том, что он не обязателен по стандарту C ++.

Причина, по которой он определен в некоторых других реализациях, состоит в том, что стандарт диктует, что должно быть доступным, а не то, что не должно. Другими словами, реализации разрешено включить его, просто не требуется , чтобы включить его.

Реализация может включать в себя все виды замечательных дополнительных вещей, при условии, что она не нарушает ничего, предусмотренного стандартом.

...