我想了解外部联系和内部联系及其区别.
我也想知道的意思
const默认情况下,变量内部链接,除非另有声明extern.
我在我的项目中使用了一个头文件,其中包含以下定义:
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
#define __I volatile /*!< Defines 'read only' permissions*/
#else
#define __I volatile const /*!< Defines 'read only' permissions*/
#endif
Run Code Online (Sandbox Code Playgroud)
将__I被用作在另一头文件如下:
typedef struct {
// more members before
__I uint32_t CR; /*!< GPIO Commit*/
// more members after
} GPIOA_Type;
#define GPIOF_BASE 0x40025000UL
#define GPIOF ((GPIOA_Type *) GPIOF_BASE)
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么__I在C中使用const而不是在C++中?您仍然可以修改CR指向的值,因为您有地址,但我只是好奇为什么定义__I不同.
对于任何感兴趣的人来说,这些__I定义来自IAR Embedded Workbench ARM for Cortex-M4,结构来自德州仪器LM4F120H5QR CMSIS文件.
我有一个非常简单的程序,它只是无限地输出一个指向const volatile char的const指针; 它是这样的:
const volatile char* const str = "ABCDEFGHIJKL";
while(true) {
cout << '\r' << str;
}
Run Code Online (Sandbox Code Playgroud)
问题是,运行此程序时,输出为1.有一种方法来解决这个问题,这是输出const_cast<char*>(str)代替str.
但是如果我做const_cast<volatile char*>(str)输出是1,就像在演员之前那样,所以我猜测1输出是由volatile关键字引起的,这很奇怪因为我认为volatile只会让编译器避免在该变量中进行优化,这应该是'改变它的价值.
因此,我的问题是世界是如何将1作为输出的.
注意:
我已经尝试在Ubuntu 16.04中使用GCC进行编译,在Windows 7中使用MinGW进行编译,因此编译器不是问题(我猜).