字符串常量前的非限定id

Poo*_*rna 1 c++ string c-preprocessor

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

In file "Notification_Constants.h"

namespace NOTIFICATION_CONSTANTS
{
    #define SERVICE_EMAIL "service@company.com"
}
Run Code Online (Sandbox Code Playgroud)

在文件SendEmail.cpp中

#include "Notification_Constants.h"

void UserPreferences::get_senders_email(String &_email)
{
    _email = NOTIFICATION_CONSTANTS::SERVICE_EMAIL;
}
Run Code Online (Sandbox Code Playgroud)

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

_email = SERVICE_EMAIL;
Run Code Online (Sandbox Code Playgroud)

有一个类似的问题,但没有提到原因.

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

class String
{
public:

String();
String(const String& src);
String(const char *new_str);
String& operator=(const String& src);
String& operator=(const char *new_str);
};
Run Code Online (Sandbox Code Playgroud)

Lst*_*tor 8

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

#define SERVICE_EMAIL "service@company.com"
Run Code Online (Sandbox Code Playgroud)

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

const String SERVICE_EMAIL = "service@company.com";
Run Code Online (Sandbox Code Playgroud)

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

最后,您可能需要考虑使用std::string而不是您的String课程.

更新:

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

_email = NOTIFICATION_CONSTANTS::"service@company.com";
Run Code Online (Sandbox Code Playgroud)

该命名空间中没有字符串常量.SERVICE_EMAIL没有任何一种的标识符-它只是指示给预处理器来替代的任何发生SERVICE_EMAIL"service@company.com".

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

_email = SERVICE_EMAIL;
Run Code Online (Sandbox Code Playgroud)

更好的方案:

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

#include "Notification_Constants.h"

namespace NOTIFICATION_CONSTANTS {
    const String REAL_SERVICE_EMAIL = SERVICE_EMAIL;
}
Run Code Online (Sandbox Code Playgroud)

然后使用NOTIFICATION_CONSTANTS::REAL_SERVICE_EMAIL,它具有范围,是一个类型,是命名空间的适当成员,依此类推.