Ошибка компиляции программы на C ++ для переименования [duplicate]

Использование рекурсивного соответствия в PHP-регулярном выражении значительно быстрее процедурного соответствия скобок. особенно с более длинными строками.

http://php.net/manual/en/regexp.reference.recursive.php

, например

$patt = '!\( (?: (?: (?>[^()]+) | (?R) )* ) \)!x';

preg_match_all( $patt, $str, $m );

vs.

matchBrackets( $str );

function matchBrackets ( $str, $offset = 0 ) {

    $matches = array();

    list( $opener, $closer ) = array( '(', ')' );

    // Return early if there's no match
    if ( false === ( $first_offset = strpos( $str, $opener, $offset ) ) ) {
        return $matches;
    }

    // Step through the string one character at a time storing offsets
    $paren_score = -1;
    $inside_paren = false;
    $match_start = 0;
    $offsets = array();

    for ( $index = $first_offset; $index < strlen( $str ); $index++ ) {
        $char = $str[ $index ];

        if ( $opener === $char ) {
            if ( ! $inside_paren ) {
                $paren_score = 1;
                $match_start = $index;
            }
            else {
                $paren_score++;
            }
            $inside_paren = true;
        }
        elseif ( $closer === $char ) {
            $paren_score--;
        }

        if ( 0 === $paren_score ) {
            $inside_paren = false;
            $paren_score = -1;
            $offsets[] = array( $match_start, $index + 1 );
        }
    }

    while ( $offset = array_shift( $offsets ) ) {

        list( $start, $finish ) = $offset;

        $match = substr( $str, $start, $finish - $start );
        $matches[] = $match;
    }

    return $matches;
}

94
задан John Dibling 10 October 2012 в 12:38
поделиться

4 ответа

Подводя итог вышеупомянутому сообщению от Cheers и hth. - Alf, убедитесь, что у вас есть main() или WinMain(), и g ++ должен поступать правильно.

Моя проблема заключалась в том, что main() был определен внутри пространства имен случайно.

54
ответ дан j0k 21 August 2018 в 04:03
поделиться
  • 1
    Просто осознал что-то важное обо всем этом. В моем случае он не нашел main (), так как я не объявлял никаких аргументов (argc, argv). После добавления он нашел основной. Кроме того, характер того, как это работает, означает, что mingw пытается помочь, предоставляя свою собственную основную функцию, которая, в свою очередь, вызывает WinMain. Программы GUI будут иметь только WinMain, а основной заглушка в mingw используется для его выхода. Если у вас есть основной, то вместо этого он использует это. – Jeff Muir 23 March 2016 в 01:53

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

- имел аналогичную проблему при создании проектов C

1
ответ дан JabbaJava 21 August 2018 в 04:03
поделиться

Рассмотрим следующую программу на уровне API на уровне Windows:

#define NOMINMAX
#include <windows.h>

int main()
{
    MessageBox( 0, "Blah blah...", "My Windows app!", MB_SETFOREGROUND );
}

Теперь давайте построим ее с помощью GNU toolchain (т. е. g ++), никаких специальных опций. Здесь gnuc - это только пакетный файл, который я использую для этого. Он предоставляет только опции, чтобы сделать g ++ более стандартным:

C:\test> gnuc x.cpp

C:\test> objdump -x a.exe | findstr /i "^subsystem"
Subsystem               00000003        (Windows CUI)

C:\test> _

Это означает, что компоновщик по умолчанию создает исполняемую консольную подсистему. Значение подсистемы в заголовке файла сообщает Windows о том, какие службы требуется программе. В этом случае с консольной системой для программы требуется окно консоли.

Это также заставляет интерпретатор команд ждать завершения программы.

Теперь давайте построим его с помощью GUI подсистемой, которая просто означает, что программа не требует окна консоли:

C:\test> gnuc x.cpp -mwindows

C:\test> objdump -x a.exe | findstr /i "^subsystem"
Subsystem               00000002        (Windows GUI)

C:\test> _

Надеюсь, это пока нормально, хотя флаг -mwindows только полудокументирован.

Построение без этого полудокументированного флага должно было бы более конкретно рассказать компоновщику, какое значение подсистемы требуется, и некоторые библиотеки импорта Windows API в общем случае должны быть указаны явно:

C:\test> gnuc x.cpp -Wl,-subsystem,windows

C:\test> objdump -x a.exe | findstr /i "^subsystem"
Subsystem               00000002        (Windows GUI)

C:\test> _

Это сработало

Но как насчет инструментальной цепочки Microsoft, то есть Visual C ++?

Ну, создание исполняемого файла подсистемы консоли прекрасно работает:

C:\test> msvc x.cpp user32.lib
x.cpp

C:\test> dumpbin /headers x.exe | find /i "subsystem" | find /i "Windows"
               3 subsystem (Windows CUI)

C:\test> _

Однако с построением инструментальной цепочки Microsoft в качестве подсистемы GUI не работает по умолчанию:

C:\test> msvc x.cpp user32.lib /link /subsystem:windows
x.cpp
LIBCMT.lib(wincrt0.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartu
p
x.exe : fatal error LNK1120: 1 unresolved externals

C:\test> _

Технически это связано с тем, что компоновщик Microsoft не является стандартным ошибка для подсистемы GUI . По умолчанию, когда подсистемой является графический интерфейс, тогда компоновщик Microsoft использует точку входа в библиотеку времени выполнения, функцию, в которой запускается машинный код, называемый winMainCRTStartup, который вызывает нестандартный Microsoft WinMain вместо стандартного main.

Нет ничего страшного в том, чтобы исправить это.

Все, что вам нужно сделать, это сообщить компоновщику Microsoft, что точка входа для использования, а именно mainCRTStartup, которая вызывает стандартный main:

C:\test> msvc x.cpp user32.lib /link /subsystem:windows /entry:mainCRTStartup
x.cpp

C:\test> dumpbin /headers x.exe | find /i "subsystem" | find /i "Windows"
               2 subsystem (Windows GUI)

C:\test> _

Нет проблем, но очень утомительно. И так тайно и скрыто, что большинство программистов Windows, которые в основном используют только инструменты Microsoft, не стандартные по умолчанию, даже не знают об этом, и ошибочно полагают, что программа подсистемы Windows GUI & ldquo; must & rdquo; имеют нестандартный WinMain вместо стандартного main. Попутно с C ++ 0x у Microsoft возникнет проблема с этим, поскольку компилятор должен затем рекламировать, является ли он независимым или размещенным (при размещении он должен поддерживать стандарт main).

В любом случае, вот почему g ++ может жаловаться на WinMain: это глупая нестандартная функция запуска, которую инструменты Microsoft по умолчанию требуют для программ подсистемы GUI.

Но как вы можете см. выше, g ++ не имеет проблем со стандартным main даже для программы подсистемы GUI.

Так что может быть проблемой?

Ну, вы, вероятно, отсутствуют a main. И у вас, вероятно, нет (правильного) WinMain! И затем g ++ после поиска main (нет такого) и для нестандартного Microsoft WinMain (нет такого) сообщает, что последний отсутствует.

Тестирование с пустым источником:

C:\test> type nul >y.cpp

C:\test> gnuc y.cpp -mwindows
c:/program files/mingw/bin/../lib/gcc/mingw32/4.4.1/../../../libmingw32.a(main.o):main.c:(.text+0xd2): undefined referen
ce to `WinMain@16'
collect2: ld returned 1 exit status

C:\test> _
162
ответ дан oɔɯǝɹ 21 August 2018 в 04:03
поделиться
  • 1
    @Alf P. Steinbach. Большое спасибо за ваш приятный ответ. Что касается All you have to do is to tell Microsoft's linker which entry point to use, namely mainCRTStartup, which calls standard main. Есть ли способ сделать это Eclipse CDT, поскольку я не использую командную строку. благодаря – Simplicity 10 March 2011 в 15:06
  • 2
    @ user588855: поскольку вы используете g ++, который (вероятно) не применим к вам. Применяется только часть в конце (возможно). То есть определите main или WinMain или убедитесь, что соответствующий файл включен в проект. Ура, – Cheers and hth. - Alf 10 March 2011 в 15:42
  • 3
    @Alf P. Steinbach. Что вы понимаете, определяя main или winmain? благодаря – Simplicity 10 March 2011 в 16:07
  • 4
    Я просто создал файл main.cpp с кодом: int main () {} – Indeed 30 December 2016 в 08:49
  • 5
    Мне было бы хорошо, если бы каждый спутник мог объяснить нисходящее движение. Возможно, у других читателей есть такое же заблуждение (что бы это ни было), и тогда мы могли бы это понять. Все выиграют, а не будут введены в заблуждение. Итак, объясните, пожалуйста, ваш downvote. Спасибо. – Cheers and hth. - Alf 6 January 2017 в 11:20

Я столкнулся с этой ошибкой при компиляции моего приложения с помощью SDL. Это было вызвано тем, что SDL определяет его собственную основную функцию в SDL_main.h. Чтобы SDL не определял основную функцию, макрос SDL_MAIN_HANDLED должен быть определен до включения заголовка SDL.h.

17
ответ дан X-Frox 21 August 2018 в 04:03
поделиться
  • 1
    Благодаря! У меня просто была эта проблема, и это было исправлено! – TMcSquared 12 May 2018 в 12:29
Другие вопросы по тегам:

Похожие вопросы: