C++ 不能像从特定命名空间调用函数那样从特定命名空间调用预处理器宏吗?

C++ 不能像从特定命名空间调用函数那样从特定命名空间调用预处理器宏吗?,c++,c++11,pointers,embedded,C++,C++11,Pointers,Embedded,好的,我正在编写一些嵌入代码,以便在msp430启动板上运行,我试图将pin切换到高位,当我开始尝试使用头文件中的一个宏时,遇到了一个问题,该宏也位于main.cpp文件中的特定命名空间中。我假设我可以使用与say相同的约定来调用该名称空间中的函数来调用宏?直到我声明使用namespace,而不是我想要的msp430::时,代码才会编译,因为头文件中有3个不同的名称空间。在不声明using名称空间的情况下,是否有办法做到这一点?我也可以使用名称空间中的变量来实现这一点,因此我看不出使用简单宏de

好的,我正在编写一些嵌入代码,以便在msp430启动板上运行,我试图将pin切换到高位,当我开始尝试使用头文件中的一个宏时,遇到了一个问题,该宏也位于main.cpp文件中的特定命名空间中。我假设我可以使用与say相同的约定来调用该名称空间中的函数来调用宏?直到我声明使用namespace,而不是我想要的msp430::时,代码才会编译,因为头文件中有3个不同的名称空间。在不声明using名称空间的情况下,是否有办法做到这一点?我也可以使用名称空间中的变量来实现这一点,因此我看不出使用简单宏def所不能实现的

expected unqualified-id before token

//section from the header file
#define P4DIR_m  *((unsigned int volatile*)0x0224u)
#define P8OUT_m  *((unsigned int volatile*)0x0262u)
#define P8DIR_m  *((unsigned int volatile*)0x0264u)
#define P1DIR_m  *((unsigned int volatile*)0x0204u)
#define LEDOUT_m *((unsigned int volatile*)0x0202u) //this line gives the error

 
//----------main.cpp

//code that called the macro orginally
msp430::LEDOUT_m |= 0x01; //this failed 

//new code
using namespace msp430;

LEDOUT_m |= 0x01; // this worked but I don't want to do this as I have other namespaces

不,宏不知道名称空间。尽可能避免使用宏。在这里,您可能可以执行以下操作

namespace msp430 {
// inline requires C++17, allowing you to put this as is in the header:
inline auto& LEDOUT_m = *reinterpret_cast<unsigned int volatile*>(0x0202u);
}

// A trick I saw in a talk by Hana Dusíková that she uses for debugging her CTRE library: https://github.com/hanickadot/compile-time-regular-expressions
template <typename T> struct report_type_name;

int main() {
    msp430::LEDOUT_m |= 0x01; // Can access namespace-qualified
    namespace NS =  msp430;
    NS::LEDOUT_m = 0x0; // Can use ns aliases 'cause why not.
    using namespace msp430;
    LEDOUT_m |= 0x02; // Can use using namespace too.
    // Uncomment the next line to check that 
    // the type really is volatile unsigned int&:
    // report_type_name<decltype(LEDOUT_m)>{};
}
名称空间msp430{
//内联需要C++17,允许您将其按原样放在标题中:
内联自动和发光二极管m=*重新解释投射(0x0202u);
}
//我在Hana Dusíkova的一次演讲中看到了一个技巧,她在调试CTRE库时使用了这个技巧:https://github.com/hanickadot/compile-time-regular-expressions
模板结构报告\类型\名称;
int main(){
msp430::LEDOUT_m |=0x01;//可以访问限定的命名空间
名称空间NS=msp430;
NS::LEDOUT\u m=0x0;//可以使用NS别名,因为为什么不能。
使用名称空间msp430;
LEDOUT_m |=0x02;//也可以使用名称空间。
//取消注释下一行以检查
//该类型实际上是volatile unsigned int&:
//报告类型名称{};
}

首先。不要发布图片,发布整个消息。第二,我们不知道这是一个真正的编译器错误,还是由第三方插件或工具产生的错误,而这些错误实际上并非来自编译器。它很可能是在使用宏的地方引起的。(您可以将宏扩展定义为几乎毫无意义的;在扩展之前它不是错误。)@molbdnilo这是正确的,如果我注释掉宏调用代码,错误就会消失,所以我想我错了,我认为您可以从特定名称空间调用定义,就像从特定名称空间调用函数一样??我使用了“``msp430::LEDOUT|m |=0x01//在main.cpp
constexpr
中设置一个高引脚是C++11的类型安全的可命名空间宏替代方案。不幸的是,该标准明确规定不能有指向文本值(例如volatile address)的
constepr
指针。解释原因,并建议使用GNU扩展名
\uuuu内置常量\u p
作为解决方法(如果您可以使用)。@mac使用名称空间msp430访问
对宏没有任何影响,并且
LEDOUT_m |=0x01将在没有它的情况下工作。宏不属于名称空间。预处理是“真正”编译开始之前的一个单独阶段。