标签: preprocessor-directive

预处理器指令:#elif未定义?

是否有预处理程序指令检查是否未定义常量.我知道该#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)

c-preprocessor preprocessor-directive

3
推荐指数
1
解决办法
9613
查看次数

我应该避免在 C++ 中使用 #define 吗?为什么,我可以使用哪些替代方案?

对于某些类型的程序,我需要使用恒定的高值来指示某些变量的某些属性。我的意思是让color[i] = 1000000;如果i树中的节点未被探索。但是我经常写错末尾的 0 数,所以我只是想知道这样做是否更好:

#define UNEXPLORED 1000000;
color[i] = UNEXPLORED;
Run Code Online (Sandbox Code Playgroud)

我记得我在某处读到过,避免使用#define 会好得多。这样对吗?你会如何解决这个问题?

c++ c-preprocessor preprocessor-directive

3
推荐指数
1
解决办法
3043
查看次数

预处理器指令if-elses是否正常运行?

如何编写不可维护的代码(结构的缩进矿):

我听说过预处理器最具想象力的用途之一是在代码准备好编译之前要求通过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)

鉴于此代码,我希望这种行为:

  1. 评估#ifndef DONEtrue,进入该区块
  2. 评估#ifdef TWICEfalse
  3. 分支进入 …

c++ obfuscation preprocessor-directive

3
推荐指数
1
解决办法
119
查看次数

确定设备是否为ARM64

我正在尝试对iOS 7进行调整,以便当设备是ARM64时它运行一个版本而不是它运行另一个版本(因为浮点数是32位而双重是64(如果你有一个解决方案)让我知道.)

所以就是这样

if ARM64 {
    \\run double code
}
else {
    \\run float code
}
Run Code Online (Sandbox Code Playgroud)

ios preprocessor-directive arm64

3
推荐指数
1
解决办法
3204
查看次数

C 预处理器:基于定义包含

如何根据定义的字符串的值包含一个文件或另一个文件?

这不起作用:

#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

macros c-preprocessor preprocessor-directive

3
推荐指数
1
解决办法
602
查看次数

相等的预处理程序测试始终评估为true

使用这个:

-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我很困惑!

c++ c-preprocessor preprocessor-directive

3
推荐指数
1
解决办法
184
查看次数

粘贴"::"和"Foo"不会提供有效的预处理令牌

我想将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"不会提供有效的预处理令牌

我上面连接令牌的方式有什么问题?

c++ macros preprocessor-directive

3
推荐指数
1
解决办法
7405
查看次数

未定义目标框架符号

我正在尝试使用 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)

c# preprocessor-directive

3
推荐指数
1
解决办法
822
查看次数

Unity 中的环境变量在开发和生产之间有所不同

有没有办法在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# unity-game-engine preprocessor-directive

3
推荐指数
1
解决办法
3381
查看次数

在 C 中使用 ## 运算符连接字符串

在 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

3
推荐指数
1
解决办法
87
查看次数