我看到这一直是在Linux内核中完成的.使用预处理器命令与普通C++ if else阻塞的目的是什么?有速度优势还是什么?
我试图想出一种通用的,易于使用的方式来运行某些代码,这取决于我当时使用的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#代码行,看起来基本上是这样的:
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) 我想使用以下预处理器定义:
[第三方标题(不能修改)]
#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)的情况下定义它们,那么该指令将被接受,但我无法访问这些定义,所以如果可能的话我想解决这个问题.
使用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)
有没有办法检查这些?
我加入TEST=1的Preprocessor Macros项目目标的部分Build Settings,每当我在代码中使用它,预处理器认为它没有定义.
例如,拥有:
#if TEST
// a
#else
// b
#endif
Run Code Online (Sandbox Code Playgroud)
有这种行为:
// b// b这是因为预处理器无法找到TEST(即使它被定义为1,如我之前所述),所以它将其视为存在false.
有什么方法可以解决这些问题吗?
编辑:
我的用例与多个项目目标有关.因此,假设初始目标已命名First,其中TEST预处理器宏已定义为value 1.
如果我创建了一个名为另一个项目目标Second未使用指定的预处理器宏和想添加一些代码,它只有当TEST是0(false没有定义/),我把它放在#else块(// b).
知道语法着色和自动完成适用// b,看起来它可以正常工作,但如果我将当前目标更改为First一个(双关语)甚至构建它,它仍然按照Second选择的方式工作.
我创建了一个针对两个框架(.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++中我有这个:http://msdn.microsoft.com/en-us/library/b0084kay(v = vs.80).aspx.
所以我可以编写只在我调试时运行的代码,或者只针对特定平台(PowerPC,MIPS,Power Macintosh等),它不再受支持,但它是一个非常好的例子.您也可以在32位和64位系统之间进行切换(当然,这仅在您发布2个不同版本时才有用,每个版本都有自己的处理器架构.在C#中,这是一种罕见的需求,但它仍然存在).
所以我的问题是如果C#中存在类似的东西.我意识到没有宏,但是有一些符号(即使是相同的#define关键字.所以它至少对我来说是有意义的 - 它应该存在.
我有一个子组件,它可能存在也可能不存在于带有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)我正在研究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# ×4
c++ ×4
.net ×1
conditional ×1
dotnet-cli ×1
if-statement ×1
javascript ×1
msbuild ×1
preprocessor ×1
vue.js ×1
xcode ×1