是否有预处理程序指令检查是否未定义常量.我知道该#ifndef指令,但我也在寻找#elif not defined指令.是否#elif not defined存在?
我就是这样用的:
#define REGISTER_CUSTOM_CALLBACK_FUNCTION(callbackFunctName) \
#ifndef CUSTOM_CALLBACK_1 \
#define CUSTOM_CALLBACK_1 \
FORWARD_DECLARE_CALLBACK_FUNCTION(callbackFunctName) \
#elif not defined CUSTOM_CALLBACK_2 \
#define CUSTOM_CALLBACK_2 \
FORWARD_DECLARE_CALLBACK_FUNCTION(callbackFunctName) \
#elif not not defined CUSTOM_CALLBACK_3 \
#define CUSTOM_CALLBACK_3 \
FORWARD_DECLARE_CALLBACK_FUNCTION(callbackFunctName) \
#endif
Run Code Online (Sandbox Code Playgroud) 对于某些类型的程序,我需要使用恒定的高值来指示某些变量的某些属性。我的意思是让color[i] = 1000000;如果i树中的节点未被探索。但是我经常写错末尾的 0 数,所以我只是想知道这样做是否更好:
#define UNEXPLORED 1000000;
color[i] = UNEXPLORED;
Run Code Online (Sandbox Code Playgroud)
我记得我在某处读到过,避免使用#define 会好得多。这样对吗?你会如何解决这个问题?
从如何编写不可维护的代码(结构的缩进矿):
我听说过预处理器最具想象力的用途之一是在代码准备好编译之前要求通过CPP五次.通过巧妙地使用define和ifdef,混淆的主人可以使头文件根据它们包含的次数声明不同的东西.当一个标题包含在另一个标题中时,这变得特别有趣.这是一个特别狡猾的例子:
#ifndef DONE
#ifdef TWICE
// put stuff here to declare 3rd time around
void g(char* str);
#define DONE
#else // TWICE
#ifdef ONCE
// put stuff here to declare 2nd time around
void g(void* str);
#define TWICE
#else // ONCE
// put stuff here to declare 1st time around
void g(std::string str);
#define ONCE
#endif // ONCE
#endif // TWICE
#endif // DONE
Run Code Online (Sandbox Code Playgroud)
鉴于此代码,我希望这种行为:
#ifndef DONE为true,进入该区块#ifdef TWICE为false我正在尝试对iOS 7进行调整,以便当设备是ARM64时它运行一个版本而不是它运行另一个版本(因为浮点数是32位而双重是64(如果你有一个解决方案)让我知道.)
所以就是这样
if ARM64 {
\\run double code
}
else {
\\run float code
}
Run Code Online (Sandbox Code Playgroud) 如何根据定义的字符串的值包含一个文件或另一个文件?
这不起作用:
#define VAR VALUE_A
#if VAR == "VALUE_A"
#include "a.h"
#elif VAR == "VALUE_B"
#include "b.h"
#endif
Run Code Online (Sandbox Code Playgroud)
如果它很重要,我实际上并没有定义VAR,我只是通过 命令行将它传递下来gcc -D NAME=VALUE。
使用这个:
-DME=AWESOME
Run Code Online (Sandbox Code Playgroud)
还有这个:
#if ME==AWESOME
#error Im awesome!
#endif
Run Code Online (Sandbox Code Playgroud)
得出这个:
Registers.cpp:59:2:错误:#error我真棒!
但是这个:
#if ME==NOTSOGREAT
#error Im confused!
#endif
Run Code Online (Sandbox Code Playgroud)
得出这个:
Registers.cpp:59:2:错误:#error我很困惑!
我想将MyNamespace ::附加到宏定义的函数:
#define transFunc(func) \
dimensionedScalar func(const dimensionedScalar& ds) \
{ \
if (!ds.dimensions().dimensionless()) \
{ \
FatalErrorIn(#func "(const dimensionedScalar& ds)") \
<< "ds not dimensionless" \
<< abort(FatalError); \
} \
\
return dimensionedScalar \
( \
#func "(" + ds.name() + ')', \
dimless, \
MyNameSpace::##func(ds.value()) \
);
\
Run Code Online (Sandbox Code Playgroud)
}
但是当我打电话时
transFunc(Foo)
Run Code Online (Sandbox Code Playgroud)
编译器抛出以下错误:
粘贴"::"和"Foo"不会提供有效的预处理令牌
我上面连接令牌的方式有什么问题?
我正在尝试使用 if 编译器指令有条件地包含 .Net Framework 早期版本所需的一些代码,但不是更高版本。
我使用了 MSDN 中的以下参考资料、#if 编译器指令参考资料和目标框架参考资料。
我正在编写一个 .Net 4.5.1 应用程序,但似乎没有定义 NET451 符号,其他任何符号也没有定义。
我已经改编了 Target Frameworks MSDN 文章中的示例以包含所有框架符号,因此我可以看到定义了哪个。
#if NET20
Console.WriteLine("Target framework: NET20");
#elif NET35
Console.WriteLine("Target framework: NET35");
#elif NET40
Console.WriteLine("Target framework: NET40");
#elif NET45
Console.WriteLine("Target framework: NET45");
#elif NET451
Console.WriteLine("Target framework: NET451");
#elif NET452
Console.WriteLine("Target framework: NET452");
#elif NET46
Console.WriteLine("Target framework: NET46");
#elif NET461
Console.WriteLine("Target framework: NET461");
#elif NET462
Console.WriteLine("Target framework: NET462");
#elif NET47
Console.WriteLine("Target framework: NET47");
#elif NET471
Console.WriteLine("Target framework: NET471"); …Run Code Online (Sandbox Code Playgroud) 有没有办法在Unity中区分开发环境和生产环境的代码?
目前,我很想使用它,这样我就可以更改广告实施的 testMode 变量。
// I would love to have something like this:
# if DEVELOPMENT
bool testMode = true;
# elif PRODUCTION
bool testMode = false;
#endif
Run Code Online (Sandbox Code Playgroud)
例如,这有效。
#if UNITY_IOS
private string gameId = "1111111";
#elif UNITY_ANDROID
private string gameId = "2222222";
#endif
Run Code Online (Sandbox Code Playgroud) 在 C 中,我们可以使用 ## 连接参数化宏的两个参数,如下所示:
arg1##arg2返回arg1arg2
我写了这段代码,希望它能连接并返回一个字符串文字,但我无法让它工作:
#define catstr(x, y) x##y
puts("catting these strings\t" catstr(lmao, elephant));
Run Code Online (Sandbox Code Playgroud)
返回以下错误:
define_directives.c:31:39: error: expected ‘)’ before ‘lmaoelephant’
31 | puts("catting these strings\t" catstr(lmao, elephant));
| ^
| )
Run Code Online (Sandbox Code Playgroud)
似乎字符串正在连接,但它们需要用引号括起来才能puts打印出来。但是这样做,宏不再起作用。我该如何解决这个问题?
c concatenation c-strings string-concatenation preprocessor-directive