Не понимаю статическое булево поведение - PullRequest
3 голосов
/ 19 сентября 2011

У меня есть заголовочный файл, в котором есть статические переменные для всех моих файлов.У меня там есть логическая переменная, инициализированная 0 -

//in utility.h
static bool read_mess = false;

, которую я хочу изменить на true, если --view-read-messages находится в аргументах командной строки, чтобы я мог сделать что-то подобное, когдаЯ получаю сообщение от клиента -

//code from a different file
if(UTILITY_H::read_mess)
    std::cout<<"\nMessage successfully received from Client 2: "<<in2;

В основном я проверяю аргумент командной строки и устанавливаю переменную read_mess в true -

//this is in a for, where temp is the command line arg[i]
else if(strcmp(temp.c_str(), "--view-read-messages") == 0) {
    UTILITY_H::read_mess = true;
}

Я могу напечататьЗначение read_mess после этой строки в main и говорит, что это правда.Но когда я проверяю, верно ли это в операторе if, который я разместил выше, read_mess возвращается к falseПочему это происходит?Я уверен, что это просто что-то простое, но я не могу заставить его работать.Все переменные в utility.h переинициализируются каждый раз, когда я выполняю UTILITY_H ::?И если да, то почему?

Ответы [ 3 ]

7 голосов
/ 19 сентября 2011

static в данном контексте означает «местный» (для единицы перевода).В вашей программе будет несколько копий read_mess, по одной на единицу перевода, что не то же самое, что заголовочный файл.(В вашем случае вы, скорее всего, можете аппроксимировать «единицу перевода» как файл .cpp или .c или .cc).

Вероятно, вы хотели объявить и externпеременная или static член класса и определяют это всего за одну единицу перевода.

На практике использование extern означает, что в заголовочном файле вы хотите написать:

extern bool read_mess;

Но в одном и только одном другом месте, которое не является заголовком:

bool read_mess = false;
1 голос
/ 19 сентября 2011

static глобальные переменные являются частными для каждого файла .c или .cpp (или единицы перевода).Если вы распечатаете адрес read_mess (например, printf("%x", &read_mess);), вы увидите разные адреса, что означает наличие двух отдельных копий логической переменной.

Решением будет удаление ключевого слова staticили заменить на extern.И поместите определение этой переменной только один раз в любой файл .c или .cpp.

1 голос
/ 19 сентября 2011

Когда вы объявляете статическую переменную в заголовочном файле, копия статической переменной создается в каждой единице перевода (заголовки + исходный файл), в которую включен файл.

Вы проверяете значение статической переменной, которая является копией, определенной для этой единицы перевода, она не совпадает с той, которую вы инициализировали в другой единице перевода.

Вам лучшеиспользование extern, если вы хотите получить доступ к переменной в разных файлах.

utility.h - включить это во все файлы, к которым вы хотите получить доступ read_mess

extern bool read_mess;  

File1.cpp - Определить read_mess в одном из исходных файлов

#include"utility.h"

bool read_mess = false;

File2.cpp - Доступ к read_mess в любом изисходные файлы

#include "utility.h"

if(read_mess)
{
    //do what interests you
}

Также,

C ++ 03 стандарт: 7.3.1.1/2 говорит:

Использование статического ключевого слова не рекомендуется при объявлении объектов в области пространства имен, без имени-пространства имен обеспечивает превосходную альтернативу.

...