Forum Linux.pl
Programowanie => C/C++ => Wątek zaczęty przez: w 2005-12-10, 21:03:32
-
w jaki sposob moge zmienic folder w ktorym umieszczone sa zakladki ??
-
2005-12-10 21:03:32 spony napisał:
> w jaki sposob moge zmienic folder w ktorym umieszczone sa zakladki ??
Moglbys jasniej ?
-
2005-12-10 21:03:32 spony napisał:
> w jaki sposob moge zmienic folder w ktorym umieszczone sa zakladki ??
Zakładki są umiesznane w pliku
~/.mozilla/firefox/xxxx/bookmarks.html
--
Maciek
-
Z góry mówie, że szukałem i wiem co to sa google.
Prubuje skompilowac najprostrzy program za pomoca gcc.
Program wyglada tak:
#include
main()
{
cout << 'costam';
}
Mam go w katalogu pod nazwa hello.cpp. Kompiluje go poleceniem gcc hello.cpp i to co otrzymuje:
In file included from /usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c ++/4.0.1/backward/iostream.h:31,
from hello.cpp:1:
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/backward/back ward_warning.h:32:2: warning: #warning This file includes at least one deprecate d or antiquated header. Please consider using one of the 32 headers found in sec tion 17.4.1.2 of the C++ standard. Examples include substituting the header for the header for C++ includes, or instead of the deprecated h eader . To disable this warning use -Wno-deprecated.
/tmp/cc8Go2A6.o(.text+0x25): In function `main':
hello.cpp: undefined reference to `std::cout'
/tmp/cc8Go2A6.o(.text+0x2a):hello.cpp: undefined reference to `std::basic_ostrea m >& std::operator<< >(std: :basic_ostream >&, char const*)'
/tmp/cc8Go2A6.o(.text+0x47): In function `__tcf_0':
hello.cpp: undefined reference to `std::ios_base::Init::~Init()'
/tmp/cc8Go2A6.o(.text+0x74): In function `__static_initialization_and_destructio n_0(int, int)':
hello.cpp: undefined reference to `std::ios_base::Init::Init()'
/tmp/cc8Go2A6.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
Prosze o wytlumaczenie lopatologiczne co robie zle i jak powinno wygladac poprawne kompilowanie pod linuxem.
-
> Prosze o wytlumaczenie lopatologiczne co robie zle i jak powinno wygladac poprawne kompilowanie
> pod linuxem.
Och... Zacznijmy od tego, że był sobie kiedyś C, ale ludziom zachciało się programowania obiektowego i powstał C++. Oczywiście C++ nie powstał w jednej chwili z chaosu, ale rodził się z C. Jak nietrudno się domyślić, dzisiaj nie mamy jednego C++ właśnie ze względu na zbyt długi proces jego powstawania. Ja wyróżniam dwa rodzaje C++:
- borlandowski (C++ be...)
- normalny (C++ OK)
Tak na serio: ten pierwszy właśnie zastosowałeś. Ma on pewne charakterystyczne naleciałości z C (jak dodawanie rozszerzenia .h dla nagłówków z biblioteki standardowej) i jest używany przez Borlanda. My jednak korzystamy z gcc, a to oznacza, że obowiązuje nas nowszy (żeby nie powiedzieć, że zwyczajnie "aktualny") standard.
Często będziesz napotykał na programy zaczynające się od:
#include
Możesz się po nich spodziewać przykrości, zwłaszcza jeżeli występuje w nich:
#include
(Borlandowska biblioteka I/O, o której lepiej zapomnieć pod Linuksem)
Czasem jednak (i tu jest ten szczęśliwy przypadek) przerobienie "starego" C++ na "nowy" jest banalne:
#include
using namespace std;
int main()
{
cout << "coś tam";
}
Oto więc łopatologiczne zasady:
1. Nagłówki z biblioteki standardowej C++ nie mają rozszerzeń (właśnie dla odróżnienia od starego C++), a więc nie . (Uwaga: jeżeli korzystamy z bibliotek C, to zachowują one stare nazewnictwo z rozszerzeniem .h).
2. Biblioteki te pracują w przestrzeni nazw std, stąd polecenie "using namespace std;"
3. Funkcja główna musi być typu int, ale nie musi jawnie zwracać wartości (tu domyślnie program zachowuje się, jakby na końcu było return (0);).
4. Literały łańcuchowe, w przeciwieństwie do pojedynczych znaków ujmujemy w cudzysłów: "coś tam".
5. Jeżeli masz źródło w hello.cpp, to najlepiej kompilować je w ten sposób:
g++ -o hello hello.cpp
Otrzymasz dzięki temu program, który można uruchomić poleceniem:
./hello
6. Polecam "C++ Leksykon kieszonkowy" z Heliona. Za 9,90PLN będziesz miał podręczny opis języka. Warto też wyposażyć się w analogiczną książeczkę nt. języka C - znajduje się tam trochę informacji, których nie ma w pozycji o C++.
-
1. Jak sam piszesz, jest to program w C++ (temat postu = "C++ w linuksie"), więc polecam kompilację komendą do C++, a nie C. Czyli:
g++ plik.cpp
2. Zgodnie ze standardem C++ obiekt cout znajduje się teraz w przestrzeni nazw std, więć trzeba pisać std::cout (lub skorzystać z: using namespace std;)
3. Stałe napisowe umieszcza się w cudzysłowach, a nie apostrofach (stałe znakowe!), a więc poprawnie będzie albo:
std::cout << "costam";
albo
std::cout << 'c';
4. Czy to jest C++ w Linuksie, czy gdzie indziej, to akurat nie ma znaczenia.
-
Dzieki za pomoc. Jakies normane forum bo na innych to sa tylko 3 warianty:
-zjebka
-olewka
-google
-
> - borlandowski (C++ be...)
> - normalny (C++ OK)
Nie ma czegoś takiego - jest jeden C++ definiowany przes standard ISO.
> Tak na serio: ten pierwszy właśnie zastosowałeś. Ma on pewne charakterystyczne naleciałości z C
> (jak dodawanie rozszerzenia .h dla nagłówków z biblioteki standardowej) i jest używany przez
> Borlanda.
Nieprawda - pliki nagłowkowe .h nadal znajdują się w systemie z powodów zgodności z C. Nie są one typowo 'Borlandowskie' i gdyby nie błędy w kodzie to program by się skompilował.
> #include
> using namespace std;
>
> int main()
> {
> cout << "coś tam";
> }
Powinno być
#include
using namespace std;
int main()
{
cout << "coś tam";
return 0;
}
Program po wykonaniu musi zwrócić do systemu jakąś wartość.
> 3. Funkcja główna musi być typu int, ale nie musi jawnie zwracać wartości (tu domyślnie program
> zachowuje się, jakby na końcu było return (0);).
Bzdura.
-
2005-12-11 01:00:35 Mefistofeles napisał:
> Dzieki za pomoc. Jakies normane forum bo na innych to sa tylko 3 warianty:
> -zjebka
> -olewka
> -google
to zalezy jedynie od tego, w jaki sposob zada sie pytanie... tobie sie akurat tym razem udalo ;-)
-
2005-12-11 01:17:43 bergo napisał:
> > - borlandowski (C++ be...)
> > - normalny (C++ OK)
>
> Nie ma czegoś takiego - jest jeden C++ definiowany przes standard ISO.
1. Napisałem, że to moje osobiste rozróżnienie.
2. Są różnice między jednym a drugim, więc mam prawo je oddzielać. Nie twierdzę, że są to różne języki, ale różne implementacje.
3. Standard określa, że biblioteki standardowe są bez rozszerzenia, a w Borlandzie (przynajmniej tym dosowym, którego używamy na uczelni) takich bibliotek nie ma, bo przed standaryzacją obowiązywały zasady z C. I jak tu nie mówić o różnych wersjach tego samego języka?
4. Cytat z "http://www.intercon.pl/~sektor/cbx/basics/intro.html":
"Zatrzegam też od razu, że język o którym piszę jest zgodny ze standardem ANSI C++ oraz ISO C++. Przede wszystkim oznacza to, że na nic się nie zdadzą kompilatory, które nie są zgodne z ANSI C++ (m.in. jeden z nadal popularnych Borland C++ 3.1). Od tamtego czasu C++ przeszedł sporo zmian i wiele rzeczy zostało wycofanych, przez co programy zgodne ze standardem nie będą w nich prawidłowe, ani też programy prawidłowe w tych kompilatorach nie będą zgodne ze standardem."
> > Tak na serio: ten pierwszy właśnie zastosowałeś. Ma on pewne charakterystyczne
> naleciałości z C
> > (jak dodawanie rozszerzenia .h dla nagłówków z biblioteki standardowej) i jest używany
> przez
> > Borlanda.
>
> Nieprawda - pliki nagłowkowe .h nadal znajdują się w systemie z powodów zgodności z C. Nie są
> one typowo 'Borlandowskie' i gdyby nie błędy w kodzie to program by się skompilował.
Z powodów zgodności z C, istnieją odpowiedniki bibliotek tego języka bez rozszerzenia .h, za to z przedrostkiem c (np. cstdlib zamiast stdlib.h). IMHO pliki nagłówkowe z rozszerzeniem .h znajdują się w systemie z powodów zgodności ze "starym" C++ (nie wiem jak Ty to określasz, skoro uważasz, że jest tylko ISO C++).
> > #include
> > using namespace std;
> >
> > int main()
> > {
> > cout << "coś tam";
> > }
>
> Powinno być
>
> #include
> using namespace std;
>
> int main()
> {
> cout << "coś tam";
> return 0;
> }
>
> Program po wykonaniu musi zwrócić do systemu jakąś wartość.
>
> > 3. Funkcja główna musi być typu int, ale nie musi jawnie zwracać wartości (tu domyślnie
> program
> > zachowuje się, jakby na końcu było return (0);).
>
> Bzdura.
By-zy-dy-u-r-a, jeżeli chodzi o to, że main nie musi być typu int (bo musi), co potwierdzają poniższe cytaty. Inaczej rzecz ma się w kwestii domyślnego zwracania wartości 0. Zwłaszcza ostatni cytat wzbudził moje wątpliwość. (dzięki za zwrócenie uwagi - zmotywowałeś mnie do zainteresowania się tą kwestią)
1. Cytaty ze wspomnianego przeze mnie leksykonu kieszonkowego:
"Typem zwracanym funkcji main jest int."
"Jeśli w treści funkcji main nie występuje instrukcja return, po wykonaniu wszystkich instrukcji funkcji main zwrócona zostaje niejawnie wartość 0."
2. Cytat z czasopisma "Komputer Świat Ekspert" (2/2004, s. 47), odnośnie kodu:
int main()
{
}
"Zaprezentowany kod jest w pełni poprawnym programem w C++, zgodnym ze standardem ISO C++ (jak również standardem C99). Standard ten mówi bowiem, że jeśli w funkcji głównej main nie ma instrukcji return, do systemu zwracana jest wartość 0 (czyli kod zachowuje się tak, jakby instrukcja istniała).
Jeszcze większym błędem jest stwierdzenie, że jeśli funkcja main nie zawiera instrukcji return, to powinna mieć postać
void main()
{
}
lub też, że może zwracać inny typ wyniku niż int (na przykład float, short, double). Podkreślmy więc z całą stanowczością, że w żadnym wypadku tak być nie może. Jeśli to ma być program w C++, zgodny ze standardami C++, funkcja main musi zwracać wartość int. Wyraźnie podkreśla to sam twórca języka Bjarne Stroustup."
Dalej jest mowa o różnych zachowaniach kompilatorów, niezgodnych ze standardem. Co ciekawe Redakcja korzysta z kompilatora Borland C++ Compiler! Cofam więc stwierdzenie, że Borland jest be. Borland jest be, jeżeli chodzi o jego starą wersję DOS-ową, z której zmuszony jestem korzystać na uczelni.
3. Cytat z C++ FAQ Lite (http://klub.chip.pl/b.krzemien/c++-faq-pl/newbie.html#faq-28.3):
"[28.3] Should I use void main() or int main()?
[Recently created (in 9/02). (...)]
int main()
main() must return int. Not void, not bool, not float. int. Just int, nothing but int, only int.
Some compilers accept void main(), but that is non-standard and shouldn't be used. Instead use int main().
void main() // <— BAD; DO NOT DO THIS
{
// ...
}
int main() // <— GOOD
{
// ...
}
int main(char** argv, int argc) // <— GOOD
{
// ...
}
As to the specific return value, if you don't know what else to return just say return 0; "
(Łopatologiczne do granic możliwości. :-)
Podsumowanie: Cofam stwierdzenie, sugerujące jakoby wszystkie produkty Borlanda wspierały C++ niezgodny ze standardami, a kwestię domyślnego return 0 pozostawiam nierozsztrzygniętą. Resztę moich stwierdzeń udowodniłem, na miarę swoich możliwości.