Bästa svaret
Portabel körbar
Portable Executable-formatet är ett filformat för körbara filer, objektkoder, DLL-filer, FON-teckensnittsfiler och andra som används i 32- och 64-bitarsversioner av Windows-operativsystem. PE-formatet är en datastruktur som inkapslar den information som krävs för att Windows OS-laddaren ska kunna hantera den inslagna körbara koden.
Detta inkluderar dynamiska biblioteksreferenser för länkning, API-export och importtabeller, resurshanteringsdata och tråd -Lokal lagringsdata (TLS). På NT-operativsystem används PE-format för EXE, DLL, SYS (enhetsdrivrutin) och andra filtyper. EFI-specifikationen (Extensible Firmware Interface) anger att PE är det standardkörbara formatet i EFI-miljöer.
Svar
Portabilitet för C-källkod betyder att så länge som önskad målplattform har en fungerande C-kompilator tillgänglig, kan du flytta din C-källkod som är målplattformen genom att kompilera den utan att behöva ändra den. Eftersom nästan alla målplattformar har en C-kompilator tillgänglig för det, betraktas C som ett mycket bärbart programmeringsspråk.
Med det sagt, skriver bara kod i C inte garanterar bärbarhet. Du måste utöva disciplin för att undvika att skriva kod som inte är bärbar. Om du till exempel skriver kod som gör något av följande kommer det att leda till icke-bärbar kod:
- Gör antaganden om storlekar för alla datatyper, utom char.
- Gör antaganden om hur data anpassas i minnet och inom strukturer.
- Antar antaganden om hur data packas / stoppas i strukturer.
- Antar antaganden om byteordning (stor endian vs liten endian) .
- Använder ett icke-standardiserat kompileringstillägg, som kanske inte är tillgängligt på alla kompilatorimplementeringar.
- Använder ett icke-standardiserat bibliotekstillägg, som kanske inte är tillgängligt på alla plattformar.
- Förlitar sig på alla implementeringsdefinierade beteenden, som kan fungera annorlunda i en annan kompilatorimplementering.
- Innehåller alla odefinierade beteenden som kan verkar arbeta i en miljö, men kan bete sig oförutsägbart i en annan miljö.
- Ringer alla API (applikationsprogrammeringsgränssnitt) till operativsystemet system, som kanske inte är tillgängligt i alla miljöer.
- Antar antaganden om specifika minnesadresser (t.ex. att en specifik minnesadress mappas till ett register för hårdvaruenheter, etc.).
- Gör antaganden om storleken på en pekare eller att en pekare har samma storlek som ett int.
- Gör antaganden om hur argument skickas (på stacken eller i specifika register).
- Innehåller alla inbyggda källkoder för monteringsspråk.
- Använder en senaste och bästa funktion i C-språket som kanske inte stöds av vissa kompilatorimplementeringar (och i vissa fall kanske aldrig stöds).
- Förlitar sig på ett bibliotek som gör något av ovanstående.
Detta är inte en uttömmande lista.
Om du kan t undvik att använda icke-bärbar kod, då är det bästa alternativet att isolera den icke-bärbara koden i en separat källfil. När du sedan behöver flytta koden till en ny målplattform är det väldigt tydligt vilken delmängd av källkoden som måste ändras.