我来自Java背景,并开始使用C++中的对象.但是我遇到的一件事是人们经常使用指向对象的指针而不是对象本身,例如这个声明:
Object *myObject = new Object;
Run Code Online (Sandbox Code Playgroud)
而不是:
Object myObject;
Run Code Online (Sandbox Code Playgroud)
或者,不要使用函数,比如说testFunc():
myObject.testFunc();
Run Code Online (Sandbox Code Playgroud)
我们要写:
myObject->testFunc();
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚为什么我们这样做呢.我认为它与效率和速度有关,因为我们可以直接访问内存地址.我对吗?
人们建议大范围#ifdef进行条件编译.一个搜索#ifdef证实,它的使用是很普遍的.
然而#ifdef NAME(或等同#if defined(NAME)和相关#ifndef NAME(和#if !defined(NAME))有一个严重的缺陷:
#ifndef IS_SPECIAL
#error You're not special enough
#endif
Run Code Online (Sandbox Code Playgroud)
#include "header.h"
Run Code Online (Sandbox Code Playgroud)
gcc -DIS_SPECIAL source.cpp
显然,将会通过
#define IS_SPECIAL 1
#include "header.h"
Run Code Online (Sandbox Code Playgroud)
但是,也一样
#define IS_SPECIAL 0
#include "header.h"
Run Code Online (Sandbox Code Playgroud)
这是完全错误的事情.而一些C++编译器,传递一个以C模式处理的文件(由于扩展或命令行选项)有效#define __cplusplus 0.我看到事情破裂了
#ifdef __cplusplus
extern "C" {
#endif
/* ... */
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
在C模式下处理,其中extern "C"语法无效,因为__cplusplus实际上是自动定义的0. …
我正在学习条件编译,我认为到目前为止我对它很了解.现在,如果我有代码:
#ifdef UMP_TO_FILE
//do something here...
#endif
Run Code Online (Sandbox Code Playgroud)
我跑:
gcc myprogram.c -DUMP_TO_FILE
Run Code Online (Sandbox Code Playgroud)
然后,代码块"//在这里做某事......"被编译.现在,我的问题是:
-DUMP_TO_FILE标志究竟是什么?
我认为标志是"-D"并且它定义了宏"UMP_TO_FILE",但是我想确定它的结构和"gcc --help"并没有告诉我任何关于这个的信息,也许我不知道如何在互联网上搜索这个!!
非常感谢您分享您的知识!