2013-01-12 6 views
12

Powiel możliwe:
A function-definition is not allowed here before ‘{’Bug przez komentarzu pojedynczej linii przed linią z oświadczeniem

Chciałbym podzielić się ten błąd zrobiłem w moim kodu, jeden z trudno znaleźć:

#include <iostream> 

void StartNuclearWar() { 
    std::cout << "War in progress..." << std::endl; 
} 

int main() 
{ 
    int a = 0; 

    // Get activation codes from C:\codes\ 
    a = 1; 

    if(a == 0) { 
     StartNuclearWar(); 
    } 
} 

Gdzie to jest?

+0

Chcę zobaczyć wojnę nuklearną! – StackedCrooked

+0

Heh. Myślałem, że tylko preprocesor potraktował ukośniki w ten sposób – Ancurio

+1

@Ancurio Jest to preprocesor, który obsługuje komentarze (jak w, usuwa je ze strumienia). –

Odpowiedz

10

Błąd znajduje się w komentarzu: dla nas ostateczny \ znak reprezentuje katalog, dla kompilatora oznacza to, że poniższy wiersz jest częścią bieżącego wiersza. Oczywiście każdy programista wie o tym, ale w tym przypadku ten szczegół jest dość dobrze ukryty.

+0

Teraz jest lepiej zorganizowana. +1. –

+1

Nawet Prettify (silnik tutaj) może obsłużyć to poprawnie –

+3

Zwrócenie uwagi na ostrzeżenie kompilatora może znacznie pomóc w wyszukiwaniu takich błędów. 'MSVC' generuje domyślnie ostrzeżenie,' gcc', gdy podano '-Wcomment' (' -Wall'). – Lol4t0

2

Dobrze, MSDN nazywa to line splicing.

Wszystkie linie kończące się backslashem (\) i natychmiast po nim znak nowej linii są połączone z następnego wiersza w pliku źródłowym formowania linii logicznych z linii fizycznych. Jeśli plik nie jest pusty, plik źródłowy musi kończyć się znakiem nowej linii, który nie jest poprzedzony ukośnikiem odwrotnym.

+0

Przepraszamy, pomniejszona edycja, aby uczynić odwrotny ukośnik widocznym, ponieważ twój cytat nie miał sensu. –

+0

@Damien_The_Unbeliever dziękuję :) – Steve