关于const和ifdef的问题

时间:2010-10-28 00:04:18

标签: c++

  

可能重复:
  the role of #ifdef and #ifndef
  How many and which are the uses of “const” in C++?

我是这个领域的新手,我只是没有得到某些功能或概念。

例如,我有这段代码:

#ifdef directory

现在,我们可以在程序中使用简单的if条件。那么为什么使用#ifdef?我不明白。

我还有一个关于const的问题。我研究了一些论文,但他们只是解释了如何使用它,但我没有找到任何理由。

例如,我不清楚这一点:

const void operator=(const point& other);

在这里,我认为这是一个通过引用调用的函数。这意味着该函数表示operator =接受对其参数的引用,因此other将在此函数中表现为普通变量。 const用于表示参数不会更改参数的实际值。但是为什么在const之前使用void

2 个答案:

答案 0 :(得分:2)

我可以帮助你解决第一点问题。 #ifdef的使用是根据先前配置的信息更改编译的代码。

例如:

#define MAKE_SEVEN
#ifdef MAKE_SEVEN
    int x = 7;
#else
    int x = 9;
#endif

与_完全相同:

    int x = 7;

就编译器而言。

为什么这有用?好吧,一个原因是你可能希望为不同的机器编译不同的代码,同时仍然只有一个源代码的副本。

现在可以使用#define或甚至作为编译器命令行的一部分来设置此“配置”,例如gcc -DMAKE_SEVEN ...

比上面给出的更有用的示例可能是根据您定位的环境使用不同的数据类型。代码:

#ifdef INT_IS_32_BITS
    typedef int int32;
#else
    #ifdef LONG_IS_32_BITS
        typedef long int32;
    #else
        #error No suitable type for int32 found
    #endif
#endif
对于不同的体系结构,

将允许您为32位整数类型使用正确的类型。

对于int为32位的所有用户,您使用gcc -DINT_IS_32_BITS ...,对于long为32位的所有用户,您使用gcc -DLONG_IS_32_BITS ...,对于所有其他用户,编译器会抱怨。

答案 1 :(得分:0)

不确定为什么这与pdf-generation相关......

当您将参数传递给方法或函数时,以及通过引用或指针传递这些参数时,这些参数可以被调用的例程更改。

(const char * other)或(const point& other)向调用者指示您不修改传递参数引用(或指向)的对象。

要指示对象的方法不修改对象,请遵循带有const。

的方法声明
class X {
    private:
        char *name;
    public:
        Draw() const;        // Draw does not modify X
        const char*getName() const { return name; }
}

如果从函数返回const对象,则不允许该函数的调用者修改返回的值。当您返回不想更改的成员时,这非常有用。在上面,getName返回一个指针,该指针不能用于修改名称成员参数。

我可以告诉你const_cast<>孩子也不应该玩火柴......