首页 > 试题广场 >

以下#pragma预处理命令哪个是改变编译器的对齐方式()?

[单选题]

以下#pragma预处理命令哪个是改变编译器的对齐方式()

  • #pragma comment
  • #pragma pack
  • #pragma data_seg
  • #pragma once
#pragma comment。将一个注释记录放置到对象文件或可执行文件中。
#pragma pack。用来改变编译器的字节对齐方式。
#pragma code_seg。它能够设置程序中的函数在obj文件中所在的代码段。如果未指定参数,函数将放置在默认代码段.text中
#pragma once。保证所在文件只会被包含一次,它是基于磁盘文件的,而#ifndef则是基于宏的。
发表于 2017-10-11 20:39:09 回复(2)

#pragma data_seg()

1#pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的,有名字的数据段。最关键的是:这个数据段中的全局变量可以被多个进程共享。否则多个进程之间无法共享DLL中的全局变量。

2共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。

3,你所谓的结果正确是一种错觉。如果你在一个DLL中这么写:

#pragma data_seg("MyData")

int g_Value; // Note that the global is not initialized.

#pragma data_seg()

DLL
提供两个接口函数:

int GetValue()
{
     return g_Value;
}

void SetValue(int n)
{
     g_Value = n;
}

然后启动两个进程ABAB都调用了这个DLL,假如A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值不一定是5

发表于 2021-05-14 10:22:54 回复(0)
C
发表于 2017-08-18 13:54:36 回复(1)