Al_Bundy skrev:Jag ser fler och fler skriver "man kan visst programmera objektorienterat med C!!!". Men varför sägs det allmänt att man inte kan göra det?
Jag är helt övertygad att man kan programmera objektorienterat via C, utan dessa "C++ klasser". Men jag har aldrig sett något exempel
Här är ett exempel på hur man skulle kunna tänka lite "objektorienterad" i C:
'int main(void)' är tillåten i alla C-versioner, likväl som (argc,argv). Det är ingenting som är specifikt för C11.
C99 säger t.o.m att deklarationen av main kan se ut exakt hur som helst. Men det är bara int(void) och int(argc,argv) som du kan garantera fungerar i alla implementationer.
Var det där ett försök att skämta eller är du så där ignorant på riktigt? Jag ser dig posta nonsens i tråd efter tråd utan att ens försöka ta reda på saker själv.
AL, snälla ta reda på hur saker förhåller sig, innan du kommer med en massa påståenden, tror inte du har en aning om vad tube-klippet handlade om.
Från standarden:
6.4.1 Keywords
Syntax
1 keyword: one of
auto ∗
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
inline
int
long
register
restrict
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
_Alignas
_Alignof
_Atomic
_Bool
_Complex
_Generic
_Imaginary
_Noreturn
_Static_assert
_Thread_local
Vad syftar "samma problem" på ??
Problemet i *den* tråden var for loop med oinitierad loop-variabel,
vilket inte har ett smack med om for loopar stöds ellet inte.
xxargs skrev:Om man snävar till kraven att man skall kunna skriva lågnivådrivrutiner själv i kompilatorn _utan_ stöd av andra produkter än det som kommer med en standard kompilatormiljö (ok assembler är tillåten för tex inline-assembler i språket eller för dom första byten startuppkod, om den finns i kompilatormiljön från början), hur många då kan hacka lågnivå med direkt HW-adressering etc. på något så när strukturerat sätt (dvs. lite mer kontrollerat än peek och poke ala basic) ??
Man kan ju inte ens vara helt säker på att C går att använda. Det är väl t.ex. inte alls självklart att en C-kompilator stöder att man klämmer på flaggor som talar om att en funktion ska köras som interuptrutin (d.v.s. oftast göra speciella saker med register, ofta ha speciell återhoppinstruktion o.s.v.)
Nej, det är nog snarast så att det är vanligt att C-kompilatorer lämpar sig för hårdvarunära programmering, medan det hos kompilatorer för andra språk inte är lika vanligt.
Ja, ungefär, fast C har ett par funktioner i sig som gör att man kommer närmare hårdvaran.
Man kan t.ex. tilldela pekare absolutvärden (både för variabelpekare och funktionspekare), och det finns rikligt med datatyper som är lagom löst definerade. Därmed går det lätt att låta datatyperna stämma överens med de olika bussbredder på hårdvaruaccesser som finns, och man kan se till att pekarnas värden motsvarar fysiska adresser.
Om man t.ex. har klassisk textläges-bildhårdvara i en enkel dator så kan man deklarera en pekare till en array typ[80][25] (eller var det tvärt om?) och tilldela den till starten av skrämminnet. Då kan man skriva/läsa valfritt tecken på skärmen på samma sätt som man läser/skriver ett värde i en array.
I princip är det nära på direkt krångligt att göra en C-kompilator som INTE stöder hårdvarunära programmering.
Det som kan sätta krokben är om den som skrivit kompilatorn inte riktigt brytt sig om volatile-deklarationsmöjligheten så att accesser av hårdvaruregister sker på märkligt sätt.
Det går för övrigt att "skriva" maskinkodsnuttar i C genom att helt enkelt radda upp en hexdump i en array och använda arrayens adress som en funktionspekare. För att omöjliggöra detta krävs i princip också aktivt extrajobb från den som skriver kompilatorn.
De flesta andra språk har mer omfattande kontroller i den mån de över huvud taget hanterar pekare som i C, och då krävs specifika workarounds för att göra de trick som man får på köpet i C.
Å andra sidan leder detta till att det oftare dyker upp säkerhetsluckor i C-kod än i andra språk.