Avatar billede nielle Nybegynder
14. april 2007 - 09:51 Der er 13 kommentarer og
1 løsning

C#'s #if – hvilke foruddefinerede symboler eksistere?

Med #if precompiler direktivet, og dettes brødre, kan man influere, hvordan ens kode skal kompileres:

#if DEBUG
Console.WriteLine("Denne linje bliver kun udskrevet når man compilere i debug-mode");
#endif

Man kan selv definere symboler som DEBUG ovenfor, men Visual Studio (eller er det .Net frameworket?) kommer allerede med nogle forud definerede; DEBUG er et eksempel på et symbol som automatisk eksistere afhængigt af under hvilke forhold man kompilere sin kode.

Mit spørgsmål er nu: Findes der andre? Jeg har ikke umiddelbart haft held med at finde nogen liste.

Det jeg specielt er interesseret i er at vide om:

1) Findes der symboler som fortæller om man kompilere fra VS 2003 eller 2005 (eller SharpDevelop)?

2) Findes der symboler som fortæller om man kompilere under det fulde framework, eller om man kompilere under compact framework.
Avatar billede bulgroz Nybegynder
14. april 2007 - 14:32 #1
Så vidt jeg ved er svaret på 1 & 2 begge nej.
Man har kun #IF #THEN #ELSE og #CONST at gøre godt med.

"Debug" er blot en #CONST som bliver sat up som default når du i VS bygger debugversionen (Options DEBUG og TRACE).
http://msdn2.microsoft.com/en-us/library/kb4wyys2(VS.80).aspx

Hvis du skal have noget udover dette må du altså selv være lidt kreativ.
http://msdn2.microsoft.com/en-us/library/x435tkbk(VS.71).aspx
Avatar billede nielle Nybegynder
14. april 2007 - 17:49 #2
Hej bulgroz,

I C# hedder det nu #if, #else, #elif, #endif, #define og #undef. Der er ikke noget som hedder #const, men det du beskriver svare til hvad #define gør (jeg kan se at de hedder det i VB.Net).:^)

Takker for dine links; Det var mere end hvad jeg selv faldt frem til.

Rent faktisk svare oplysningerne til hvad man finder ud af ved at højreklikke på sit projekt i Solution Exploren, klikke Propertes i den resulterende kontekst-menu, og så vælge build-fanen:

Der kan man se at der normalt er hakket af ved "Define DEBUG constant" (dog kun når man kompilere som debug) og ved "Define TRACE constant". Man kan imidlertid selv ændre op disse default-værdier.

Der er imidlertid også et felt med titlen "Conditional compilation symbols"; Hvis man arbejder med et almindeligt Windows projekt er dette tomt, men hvis man arbejder imod Compact framework står der faktisk en af værdierne PocketPC, Smartphone eller WindowsCE alt efter hvilket projekt man startede op med. Disse kan selvfølgeligt rettes hvis man vil, ligesom af-hakningerne nævnt ovenfor kan fjernes, men det er nu alligevel et fornuftigt gæt at folk vil lade dem være som der er.

Pt. har jeg derfor klaret mit akutte problem med denne konstruktion i toppen af koden:

#if PocketPC || Smartphone || WindowsCE
#define CompactFW
#else
#define NotCompactFW
#endif

Jeg er dog stadig nysgerrig efter om der vitterlig ikke er defineret mere end dette.
Avatar billede bulgroz Nybegynder
14. april 2007 - 19:13 #3
Ja du har ret det var en lidt uheldig VB-smutter, men svaret er nu stadig det samme bortset fra syntaxen ;-)
Avatar billede nielle Nybegynder
14. april 2007 - 20:55 #4
Jeg vil så vove at påstå at du ikke havde helt ret i dit svar på 2). Men smid du bare et svar for point. :^)
Avatar billede bulgroz Nybegynder
14. april 2007 - 23:27 #5
Glem blot points.
Avatar billede arne_v Ekspert
15. april 2007 - 05:59 #6
du kan sikkert ikke bruge det til noget, men den slags er nemt hvis man builder med nant
Avatar billede arne_v Ekspert
15. april 2007 - 06:00 #7
<project name="v" default="build">
    <target name="build">
        <csc optimize="true" target="exe" define="${string::to-upper(string::replace(string::replace(framework::get-target-framework(),'-',''),'.',''))}" output="v.exe">
            <sources>
                <include name="v.cs"/>
            </sources>
        </csc>
    </target>
</project>
Avatar billede arne_v Ekspert
15. april 2007 - 06:00 #8
using System;

public class V
{
    public static void Main(string[] args)
    {
#if NET11
        Console.WriteLine("I was compiled for MS .NET 1.1");
#elif NET20
        Console.WriteLine("I was compiled for MS .MET 2.0");
#elif MONO10
        Console.WriteLine("I was compiled for Mono 1.0");
#elif MONO20
        Console.WriteLine("I was compiled for Mono 2.0");
#endif
    }
}
Avatar billede arne_v Ekspert
15. april 2007 - 06:02 #9
C:\e4>nant -t:net-1.1
NAnt 0.85 (Build 0.85.2478.0; release; 14-10-2006)
Copyright (C) 2001-2006 Gerry Shaw
http://nant.sourceforge.net

Buildfile: file:///C:/e4/v.build
Target framework: Microsoft .NET Framework 1.1
Target(s) specified: build


build:

      [csc] Compiling 1 files to 'C:\e4\v.exe'.

BUILD SUCCEEDED

Total time: 0.3 seconds.


C:\e4>v
I was compiled for MS .NET 1.1

C:\e4>del v.exe

C:\e4>nant -t:net-2.0
NAnt 0.85 (Build 0.85.2478.0; release; 14-10-2006)
Copyright (C) 2001-2006 Gerry Shaw
http://nant.sourceforge.net

Buildfile: file:///C:/e4/v.build
Target framework: Microsoft .NET Framework 2.0
Target(s) specified: build


build:

      [csc] Compiling 1 files to 'C:\e4\v.exe'.

BUILD SUCCEEDED

Total time: 0.4 seconds.


C:\e4>v
I was compiled for MS .MET 2.0

C:\e4>del v.exe

C:\e4>nant -t:mono-1.0
NAnt 0.85 (Build 0.85.2478.0; release; 14-10-2006)
Copyright (C) 2001-2006 Gerry Shaw
http://nant.sourceforge.net

Buildfile: file:///C:/e4/v.build
Target framework: Mono 1.0 Profile
Target(s) specified: build


build:

      [csc] Compiling 1 files to 'C:\e4\v.exe'.

BUILD SUCCEEDED

Total time: 0.8 seconds.


C:\e4>mono v.exe
I was compiled for Mono 1.0

C:\e4>del v.exe

C:\e4>nant -t:mono-2.0
NAnt 0.85 (Build 0.85.2478.0; release; 14-10-2006)
Copyright (C) 2001-2006 Gerry Shaw
http://nant.sourceforge.net

Buildfile: file:///C:/e4/v.build
Target framework: Mono 2.0 Profile
Target(s) specified: build


build:

      [csc] Compiling 1 files to 'C:\e4\v.exe'.

BUILD SUCCEEDED

Total time: 0.7 seconds.


C:\e4>mono v.exe
I was compiled for Mono 2.0
Avatar billede nielle Nybegynder
15. april 2007 - 06:36 #10
Hej Arne,

Takker for input. Jeg er dog godt klar over hvad men kan gøre med NAnt og jeg kan i øvrigt også selv finde ud af at definere precompiler symboler (det kaldes de i C# selvom Visual Studio mig bekendt ikke har nogen precopmpiler som sådan).

Sagen er dog den at jeg har noget open-source kode som jeg arbejder på og opdatere løbende. Dette er udviklet til Windows-platformen (som en DLL), men jeg oplever sommetider at folk ønsker at bruge det på en PDA eller lignende. Det er der heller ikke noget problem i, blot at jeg holder tungen lige i munden og ikke bruger klasser som ikke findes i .Net Compact Frameworket.

Alligevel vil jeg gerne have muligheden for at kunne bruge visse klasser under nogen omstændigheder for at give noget ekstra funktionalitet, og jeg ledte derfor efter en metode til at sikre at selvom folk valgte at rå-kopiere kildekoden til et CF-projekt ... at den så stadig ville kompilere.

Takker for hjælpen begge to, og for input.

(Jeg har faktisk endnu ikke tjekket om koden vil kompilere under mono, eller om den så efterfølgende kan køre på en linux-platfom :^)
Avatar billede nielle Nybegynder
15. april 2007 - 06:36 #11
...
Avatar billede arne_v Ekspert
22. april 2007 - 01:56 #12
pointen i det er at man ikke seln sætter symbolet op men at NAnt gør det udfra
hvilken compiler man har brugt

men der er ingen måde hvorpå du kan beskytte dig effektivt imod "forkert" copy paste - de
kunne jo også tage noget midt i en #if #endif blok
Avatar billede nielle Nybegynder
22. april 2007 - 06:47 #13
Jeg ville aller helst have at symbolerne var indbygget i frameworket ... men det er de jo altså ikke: Enten er det VS der sætter dem eller også er det NAnt som sæytter dem. Jeg formoder at SharpDevelop gør noget lignende.

Det er nu forresten ikke et spørgsmål om cut'n'paste. Dem som flytter filerne over til et CF projekt, tager som regel hele filen, og alle filerne. :^)
Avatar billede arne_v Ekspert
22. april 2007 - 16:04 #14
kan du så ikke:

#if NET11
        Console.WriteLine("I was compiled for MS .NET 1.1");
#elif NET20
        Console.WriteLine("I was compiled for MS .MET 2.0");
#elif MONO10
        Console.WriteLine("I was compiled for Mono 1.0");
#elif MONO20
        Console.WriteLine("I was compiled for Mono 2.0");
#else
#error Du har kraftederme bare at definere et symbol svarende til din platform
#endif

?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester