标签: preprocessor-directive

为什么使用预处理器#if语句而不是if()else?

我看到这一直是在Linux内核中完成的.使用预处理器命令与普通C++ if else阻塞的目的是什么?有速度优势还是什么?

c++ if-statement c-preprocessor preprocessor-directive

10
推荐指数
3
解决办法
2798
查看次数

是否可以比较条件使用的#ifdef值

我试图想出一种通用的,易于使用的方式来运行某些代码,这取决于我当时使用的api.

在标题中:

#define __API_USED cocos2d-x

#define COCOS2DX  cocos2d-x
#define OPENGL opengl

#ifdef __API_USED == COCOS2DX
    #define USING_COCOS2DX
    #undef USING_OPENGL
#endif
Run Code Online (Sandbox Code Playgroud)

来源:

#ifdef USING_COCOS2DX
    ......
#endif
Run Code Online (Sandbox Code Playgroud)

但是,我不认为这会奏效.

有没有办法完成我想做的事情?

c++ conditional c-preprocessor preprocessor-directive

10
推荐指数
2
解决办法
2万
查看次数

在编译时检测c#版本

我有一个旧的c#代码行,看起来基本上是这样的:

foo.set_Parent(parent);
Run Code Online (Sandbox Code Playgroud)

它已经编好了多年.现在在VS2015中我收到错误:

CS0571'Foo.Parent.set':无法显式调用运算符或访问器

所以我可以改写这行:

foo.Parent=parent;
Run Code Online (Sandbox Code Playgroud)

这在VS2015中构建得很好,但是在VS2013中它给出了错误:

语言不支持'Foo.Parent'; 尝试直接调用访问器方法'Foo.get_Parent()'或Foo.set_Parent(Foo)'

因此,简单的解决方法是简单地根据正在运行的编译器版本来定义这两行.但是,如何检测正在执行的编译器版本?

而且,对于记录,不,我不能只是要求团队中的每个人同时升级到VS2015.

附加信息 - 对于每个闻到老鼠的人来说,我会继续拖出丑陋的真相,尽管我认为它不会改变任何东西.Foo类是来自一个古老的Borland集合体,它在Delphi中都是绑定的(是的,我们正在迁移,但还没有迁移).因此,编译为VS2013的实际代码如下所示:

using Borland.Vcl;
using RepGen;
using SnapReportsForm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;

namespace MigrantCOM {
   [ComVisible(true)]
   [Guid("48245BA3-736B-4F98-BDC5-AD86F77E39F4")]
   [ProgId("MigrantCOM.Exports")]
   [ClassInterface(ClassInterfaceType.AutoDual)]
          public class MigrantCLRExports {   // : MarshalByRefObject 
      public string Test(string s) { return s+s; }
   }

   [ComVisible(true)]
   [Guid("1154D364-B588-4C31-88B9-141072303117")]
   [ProgId("MigrantCOM.SnapRepCOM")]
   [ClassInterface(ClassInterfaceType.AutoDual)]
   public class SnapRepCOM {
      TRepGen repGen;
      TStringList snapRefs=new TStringList();
      TForm parent=new TForm(null);
      TMemo designerMemo;
      List<TReference> references=new List<TReference>();
      TRunAsSnapContext runAsSnapContext=new TRunAsSnapContext();

      public SnapRepCOM() {
         designerMemo=new TMemo(parent); …
Run Code Online (Sandbox Code Playgroud)

c# preprocessor-directive

10
推荐指数
1
解决办法
379
查看次数

如何从#define中删除C风格的强制转换,以便我可以在预处理器#if中使用它?

我想使用以下预处理器定义:

[第三方标题(不能修改)]

#define SWCI_VERSION_MAJOR              (unsigned char) 4
#define SWCI_VERSION_MINOR              (unsigned char) 16
Run Code Online (Sandbox Code Playgroud)

当他们以这种方式进行比较时:

[我的实施]

#if SWCI_VERSION_MAJOR >= 4 && SWCI_VERSION_MINOR >= 16
Run Code Online (Sandbox Code Playgroud)

然后我得到:

致命错误C1017:无效的整数常量表达式

我注意到如果我在没有(unsigned char)的情况下定义它们,那么该指令将被接受,但我无法访问这些定义,所以如果可能的话我想解决这个问题.

c++ preprocessor-directive

10
推荐指数
1
解决办法
666
查看次数

以编程方式检查构建配置

使用DEBUG配置,我可以使用以下类型的语法打开和关闭行为:

#if DEBUG
    Console.WriteLine("Debug");
#else
    Console.WriteLine("Not Debug");
#endif
Run Code Online (Sandbox Code Playgroud)

但是,如果我设置了不同的配置,请说:TEST然后这不起作用:

#if TEST
    Console.WriteLine("Test");
#else
    Console.WriteLine("Not Test");
#endif
Run Code Online (Sandbox Code Playgroud)

有没有办法检查这些?

.net c# c-preprocessor preprocessor-directive

10
推荐指数
2
解决办法
7283
查看次数

目标预处理器宏在Xcode中被预处理器忽略

我加入TEST=1Preprocessor Macros项目目标的部分Build Settings,每当我在代码中使用它,预处理器认为它没有定义.

  1. alt +点击它会显示一个问号
  2. 语法着色不起作用
  3. 语法自动完成功能不起作用

例如,拥有:

#if TEST

// a

#else

// b

#endif
Run Code Online (Sandbox Code Playgroud)

有这种行为:

  1. 语法着色仅适用于 // b
  2. 语法自动完成仅适用于 // b

这是因为预处理器无法找到TEST(即使它被定义为1,如我之前所述),所以它将其视为存在false.

有什么方法可以解决这些问题吗?

编辑:

我的用例与多个项目目标有关.因此,假设初始目标已命名First,其中TEST预处理器宏已定义为value 1.

如果我创建了一个名为另一个项目目标Second未使用指定的预处理器宏和想添加一些代码,它只有当TEST0(false没有定义/),我把它放在#else块(// b).

知道语法着色和自动完成适用// b,看起来它可以正常工作,但如果我将当前目标更改为First一个(双关语)甚至构建它,它仍然按照Second选择的方式工作.

xcode preprocessor preprocessor-directive

10
推荐指数
2
解决办法
4135
查看次数

将定义常量传递给 dotnet build 会杀死目标框架符号

我创建了一个针对两个框架(.net core 2.2 和 .net core 3.0)并使用目标框架符号(NETCOREAPP2_2 和 NETCOREAPP3_0)的小型应用程序。

项目文件非常简单,如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netcoreapp3.0;netcoreapp2.2</TargetFrameworks>
    <OutputType>Exe</OutputType>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

程序代码可能再简单不过了:

public class MyClass
{
    static void Main()
    {
#if NETCOREAPP3_0
        System.Console.WriteLine("Target framework: NETCOREAPP3_0");
#elif NETCOREAPP2_2  
        System.Console.WriteLine("Target framework: NETCOREAPP2_2");
#else
        System.Console.WriteLine("Target framework: WHO KNOWS?!");
#endif

#if TEST_RUN
        System.Console.WriteLine("Test mode active!");
#endif
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用常规命令而不带附加参数构建它dotnet build --no-incremental,则两个版本都会创建并按预期工作:

PS>> dotnet .\bin\Debug\netcoreapp2.2\TargetFramework.dll
Target framework: NETCOREAPP2_2
PS>> dotnet .\bin\Debug\netcoreapp3.0\TargetFramework.dll
Target framework: NETCOREAPP3_0
Run Code Online (Sandbox Code Playgroud)

在我的场景中,我需要使用附加编译符号构建两个版本TEST_RUN。所以我在构建命令中添加了额外的参数dotnet build --no-incremental -p:DefineConstants=TEST_RUN。结果我有一个应用程序,但不知道目标框架:

PS>> dotnet .\bin\Debug\netcoreapp2.2\TargetFramework.dll
Target framework: …
Run Code Online (Sandbox Code Playgroud)

c# msbuild preprocessor-directive dotnet-cli

10
推荐指数
1
解决办法
4701
查看次数

C#有预定义的符号吗?

在C++中我有这个:http://msdn.microsoft.com/en-us/library/b0084kay(v = vs.80).aspx.

所以我可以编写只在我调试时运行的代码,或者只针对特定平台(PowerPC,MIPS,Power Macintosh等),它不再受支持,但它是一个非常好的例子.您也可以在32位和64位系统之间进行切换(当然,这仅在您发布2个不同版本时才有用,每个版本都有自己的处理器架构.在C#中,这是一种罕见的需求,但它仍然存在).

所以我的问题是如果C#中存在类似的东西.我意识到没有宏,但是有一些符号(即使是相同的#define关键字.所以它至少对我来说是有意义的 - 它应该存在.

c# preprocessor-directive

9
推荐指数
3
解决办法
4672
查看次数

Vuejs - 使用 v-if 切换的保持活动组件

问题

我有一个子组件,它可能存在也可能不存在于带有v-if. 试图在用户单击其他内容时将其缓存,以便无论我如何尝试使用<keep-alive>.

我试过的

文件似乎表明,所有我需要做的就是总结我的成分在<keep-alive>标签和事情应该只是工作。我尝试匹配一些使用<component>明显不起作用的标签的文档。我也尝试过使用include道具,因为仅仅包装它是行不通的。

Vue.component('child', {
  template: '<div>child: {{text}}<div>',
  data() {return {text: ""}},
  created(){
    this.$nextTick(() => {
      this.text = `${Math.round(Math.random() * 100)}`
  })
},
  activated: function() {
    this.$nextTick(() => {
    	console.log('in activated');
    });
  }
})

var vm = new Vue({
  el: '#app',
  data: function() {
    return {
      showNow:false,
      message: 'This is a test.'
    }
  },
  methods: {
    changeText: function() {
      this.message = 'changed';
    },
    toggle() {
      this.showNow …
Run Code Online (Sandbox Code Playgroud)

javascript preprocessor-directive vue.js

9
推荐指数
1
解决办法
4670
查看次数

在C++中使用#undef

我正在研究GSL库中的一段代码,并在头文件的开头用几行困惑.我理解#undef,#ifdef等是什么,但我不明白为什么他们基本上重置_BEGIN_DECLS的定义然后再继续定义它?从技术上讲,不应该有任何先前的定义,对吗?我的意思是,这些东西是静态的,不受变化的影响.无论如何,这里是代码的摘录:

    #undef __BEGIN_DECLS
    #undef __END_DECLS
    #ifdef __cplusplus
    # define __BEGIN_DECLS extern "C" {
    # define __END_DECLS }
    #else
    # define __BEGIN_DECLS /* empty */
    # define __END_DECLS /* empty */
    #endif
Run Code Online (Sandbox Code Playgroud)

c++ c-preprocessor preprocessor-directive

8
推荐指数
1
解决办法
386
查看次数