代码之家  ›  专栏  ›  技术社区  ›  Chris Chubb

C语言中的“神奇”常量,比如PHP?

  •  1
  • Chris Chubb  · 技术社区  · 16 年前

    http://php.net/manual/en/language.constants.predefined.php 但是我在C编译器语言中没有看到类似的东西。

    我在找不存在的东西吗?

    6 回复  |  直到 16 年前
        1
  •  2
  •   devio    16 年前

    使用StackTrace/StackFrame类,您可以让控件找出调用它的位置,而不是向它传递以下信息:

    private static StringBuilder ListStack(out string sType)
    {
      StringBuilder sb = new StringBuilder();
      sType = "";
    
      StackTrace st = new StackTrace(true);
      foreach (StackFrame f in st.GetFrames())
      {
        MethodBase m = f.GetMethod();
        if (f.GetFileName() != null)
        {
          sb.AppendLine(string.Format("{0}:{1} {2}.{3}",
            f.GetFileName(), f.GetFileLineNumber(),
            m.DeclaringType.FullName, m.Name));
    
          if (!string.IsNullOrEmpty(m.DeclaringType.Name))
            sType = m.DeclaringType.Name;
        }
      }
    
      return sb;
    }
    

    (一) used 此代码用于获取当前执行的方法的调用堆栈,因此它所做的比您要求的要多)

        2
  •  2
  •   Will Dean    16 年前

    StackTrace/StackFrame类将为您提供相当多的信息,尽管它们的构造成本可能相当高。

        3
  •  2
  •   Hamish Grubijan    16 年前

    您可以要求系统提供堆栈跟踪,并且可以使用反射。细节即将揭晓。

    __LINE__ 
    __FILE__ 
    __DIR__ 
    __FUNCTION__  (does not really exist in C#) 
    __CLASS__
    __METHOD__
    __NAMESPACE__
    

    您将在调试(非优化)构建中获得更好的信息。PhP可能总是可以访问所有这些东西,但它不是这个星球上最快的枪。玩一玩,让我知道少了什么。

        4
  •  1
  •   Chuck Conway    16 年前

    __CLASS__ :如果需要当前类名,则需要使用反射。

    __LINE__

    __DIR__ :使用DirectoryInfo类获取文件的目录。

    __FUNCTION__ 和 __METHOD__ :函数名(方法名),可通过反射检索。

    __NAMESPACE__ :无法通过反射检索命名空间

        5
  •  1
  •   Brian S    16 年前

    使用 Type ,您所能做的最好的事情就是获取有关当前类的信息。无法获取文件(尽管通常每个文件只能有一个类)、行号或函数 Type .

    this.getType() ,或 typeof(MyClass)

    您可以通过生成 StackTrace 对象并检索 StackFrame 但重复这样做是个坏主意。

    我认为一个更重要的问题也许是:你为什么需要它们?对于跟踪调试,您的输出应该是临时的,因此它是否反映了准确的行号应该无关紧要(事实上,我很少在跟踪调试中包含行号)。visualstudio作为一个真正的step调试器也非常有用。您真正需要的文件、类、函数和行号是什么?

    编辑:对于错误检查,使用异常,就像它们是要被使用的:对于异常(错误)情况。异常将生成一个堆栈跟踪,将您指向问题所在。

        6
  •  0
  •   Tedford    16 年前