在我们的C代码库中,我看到每个宏都按以下方式定义:
#ifndef BEEPTRIM_PITCH_RATE_DEGPS
#define BEEPTRIM_PITCH_RATE_DEGPS 0.2f
#endif
#ifndef BEEPTRIM_ROLL_RATE_DEGPS
#define BEEPTRIM_ROLL_RATE_DEGPS 0.2f
#endif
#ifndef FORCETRIMRELEASE_HOLD_TIME_MS
#define FORCETRIMRELEASE_HOLD_TIME_MS 1000.0f
#endif
#ifndef TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS
#define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS 50.0f
#endif
Run Code Online (Sandbox Code Playgroud)
这些定义检查的理由是什么,而不仅仅是定义宏?
#define BEEPTRIM_PITCH_RATE_DEGPS 0.2f
#define BEEPTRIM_ROLL_RATE_DEGPS 0.2f
#define FORCETRIMRELEASE_HOLD_TIME_MS 1000.0f
#define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS 50.0f
Run Code Online (Sandbox Code Playgroud)
我无法在网络上的任何地方找到这种做法.
我试图为特定目标排除Swift文件的某些部分.然而,我没有找到#ifndef objective-c指令的替代品,而且如果我使用这种形式:
#if taxi_coops
func pippo(){
println("pippo");
}
#else
func triggerActiveLocationUpdate(entering:Bool){}
#endif
Run Code Online (Sandbox Code Playgroud)
预处理器完全忽略该指令并尝试编译triggerActiveLocationUpdate.请注意#if taxi_coops指令在同一文件的其他部分中受到尊重.
有没有办法简单地在Swift中排除一些代码和/或为什么我的修复不起作用?
下一个模式在C代码中很常见:
#ifndef SOMETHING
#define SOMETHING
#endif
Run Code Online (Sandbox Code Playgroud)
这种模式在Delphi代码中也是可能的:
{$IFNDEF SOMETHING}
{$DEFINE SOMETHING}
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)
但这并不常见 - 我从来没有见过它.如果Delphi代码需要条件定义,它只是定义它而不IFNDEF
检查.
为什么这样?C和Delphi之间条件编译的区别是什么ifndef
,以便前者需要检查而后者不需要检查?
我正在尝试在MuPDF中启用调试选项.出于某种原因,他们使用了我想要使用的代码#ifndef NDEBUG
并使其#endif
变灰.我在整个图书馆搜索,但找不到任何地方定义的任何NDEBUG痕迹.我已经设法通过添加#undef NDEBUG
标题来解决这个问题,但我想知道是否有更多非侵入性的方法来执行此操作.
那么,你能从makefile中启用"#ifndef /#endif"块吗?
另外,为什么你会使用#ifndef
灰色代码?不应该是#ifdef NDEBUG
吗?
在定义宏函数之前,我可以检查它是否已经存在
(这可以避免覆盖先前的定义).
我可以像这样实现检查和定义:
#ifndef MACRO(X)
#define MACRO(X) FUNCTION(X)
#endif
Run Code Online (Sandbox Code Playgroud)
或者像这样:
#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif
Run Code Online (Sandbox Code Playgroud)
当函数已经定义时,两者似乎都有效.
那么,哪个是正确的?哪个更受欢迎?
我知道我在这里一定做错了什么。
等级.h
#ifndef RANK_H
#define RANK_H
namespace mmi {
int chunk;
void rank(int my_rank);
}
#endif
Run Code Online (Sandbox Code Playgroud)
排名.cpp
#include "rank.h"
namespace mmi {
//do something with chunk
}
Run Code Online (Sandbox Code Playgroud)
主程序
#include "rank.h"
int main() {
mmi::chunk = 1;
}
Run Code Online (Sandbox Code Playgroud)
以及编译的输出;
g++ -g -Wall -std=gnu++11 -c -o main.o main.cpp
g++ -g -Wall -std=gnu++11 -c -o rank.o rank.cpp
mpic++ main.o rank.o -o main
rank.o:(.bss+0x0): multiple definition of `mmi::chunk'
main.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Makefile:12: recipe for target 'main' …
Run Code Online (Sandbox Code Playgroud) 考虑一下代码.
#ifndef FOO_H
#define FOO_H
//Code
#endif
Run Code Online (Sandbox Code Playgroud)
代码可以是以下情况
// Case 1:
#define foo 0
Run Code Online (Sandbox Code Playgroud)
// Case 2:
void foo_method(){};
Run Code Online (Sandbox Code Playgroud)
// Case 3:
int foo;
Run Code Online (Sandbox Code Playgroud)
foo.h
包含在许多C文件中.当我只编译案例1没有错误时,其他情况会抛出重复错误.
为什么foo.h
在编译时没有连接到C文件除外?
编译文件时尝试在我的代码中应用默认值。
我需要在我的代码中将定义的关键字设置为某个值。
因此,当我编译代码并且它在编译器的参数中没有收到任何定义时,它将使用我的默认值。
我不确定如何做到这一点,但我有一点想法:
#ifndef MAXWORKLOAD
#define MAXWORKLOAD 10
#endif
Run Code Online (Sandbox Code Playgroud)
因此,如果我将其放入代码中并在参数中使用此命令行:
gcc -W -Wall
Run Code Online (Sandbox Code Playgroud)
它会使用 10 有默认吗?
如果我在编译时使用这个命令行:
gcc -W -Wall -DMAXWORKLOAD=5
Run Code Online (Sandbox Code Playgroud)
它将使用 5 作为其新设置?
通过阅读有关此的文档,我不太清楚。
请在这里建议我一个提示:
class UIClass
{
public:
UIClass::UIClass();
};
#ifndef __PLATFORM__
#define __PLATFORM__
UIClass Platform;
#else
extern UIClass Platform;
#endif
Run Code Online (Sandbox Code Playgroud)
我包括这两次,得到:
LNK2005 - 已在.obj(MSVS13)中定义的平台.
你可以猜到,这个想法只是定义一次Platform.为什么#ifndef
或#define
失败?我该怎么解决这个问题?
我正在使用MicroPython,它们的头文件使用了大量
#ifndef function_name
void function_name(const char *str, size_t len);
#endif
Run Code Online (Sandbox Code Playgroud)
使用在线 C 和 C++ 编译器,我尝试使用以下代码在 C++ 中进行测试
#include <iostream>
using namespace std;
void func();
#ifndef func
int a = 5;
#else
int a = 3;
#endif
int main()
{
cout << "a = " << a << endl;
}
Run Code Online (Sandbox Code Playgroud)
而在C语言中
#include <stdio.h>
void func();
#ifndef func
int a = 5;
#else
int a = 3;
#endif
int main()
{
printf("Hello World");
printf("a = %d\n", a);
return 0;
} …
Run Code Online (Sandbox Code Playgroud)