字符串常量前的非限定id

时间:2011-05-05 10:29:12

标签: c++ string c-preprocessor

在编译以下代码时,我得到错误“在字符串常量之前预期的unqualified-id”

In file "Notification_Constants.h"

namespace NOTIFICATION_CONSTANTS
{
    #define SERVICE_EMAIL "service@company.com"
}

在文件SendEmail.cpp

#include "Notification_Constants.h"

void UserPreferences::get_senders_email(String &_email)
{
    _email = NOTIFICATION_CONSTANTS::SERVICE_EMAIL;
}

如果我分配如下,它可以正常工作,编译错误的原因是什么。

_email = SERVICE_EMAIL;

有一个类似的question,但没有提到原因。

带有相关方法的字符串类声明

class String
{
public:

String();
String(const String& src);
String(const char *new_str);
String& operator=(const String& src);
String& operator=(const char *new_str);
};

4 个答案:

答案 0 :(得分:8)

首先,您应在电子邮件地址周围加上引号:

#define SERVICE_EMAIL "service@company.com"

其次,你根本不应该使用#define。请改用const变量:

const String SERVICE_EMAIL = "service@company.com";

#define类型不安全,没有范围,通常是邪恶的。

最后,您可能需要考虑使用std::string而不是String类。

<强>更新

问题是预处理器#define只不过是文本替换。预处理器完成后,编译器将看到

_email = NOTIFICATION_CONSTANTS::"service@company.com";

该命名空间中没有字符串常量。 SERVICE_EMAIL不是任何类型的标识符 - 它只是指示预处理器用SERVICE_EMAIL替换"service@company.com"的任何事件。

解决方案是删除命名空间限定符:

_email = SERVICE_EMAIL;

更好的解决方案:

如果您无法访问#define,则应尽可能将其包装在头文件中:

#include "Notification_Constants.h"

namespace NOTIFICATION_CONSTANTS {
    const String REAL_SERVICE_EMAIL = SERVICE_EMAIL;
}

然后使用NOTIFICATION_CONSTANTS::REAL_SERVICE_EMAIL代替,它具有范围,是一个类型,是命名空间的正确成员,依此类推。

答案 1 :(得分:1)

问题是,我认为因为我不知道String类型,所以SERVICE_EMAIL应该是字符串文字:

#define SERVICE_EMAIL "service@company.com"

但是,即使在后一种解决方案中它也应该失败。也许你的代码片段没有显示真正的问题。

答案 2 :(得分:0)

#define SERVICE_EMAIL "service@company.com"

答案 3 :(得分:0)

service@company.com的类型是什么? 我想您希望使用字符串来存储电子邮件地址。

尝试:

 #define SERVICE_EMAIL "service@company.com"