В чем разница между #include и #include «filename»?

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

Предположим, что по какой-либо причине вы хотите оценить стандартное отклонение ( sd) среднего нулевого нормального распределения путем моделирования, с учетом выборки. Это может быть достигнуто путем выполнения численной оптимизации вокруг этапов

  1. (Установка семени)
  2. Учитывая значение для sd, генерирует нормально распределенные данные
  3. Оцените вероятность ваших данных при моделируемых дистрибутивах

Следующие функции делают это один раз без шага 1. один раз включив его:

# without fixing the seed
simllh <- function(sd,y,Ns){
  simdist <- density(rnorm(Ns,mean=0,sd=sd))
  llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
  return(-sum(log(llh)))
}
# same function with fixed seed
simllh.fix.seed <- function(sd,y,Ns){
  set.seed(48)
  simdist <- density(rnorm(Ns,mean=0,sd=sd))
  llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
  return(-sum(log(llh)))
}

Мы можем проверить относительная производительность двух функций при обнаружении истинного значения параметра с коротким исследованием Монте-Карло:

N <- 20; sd <- 2 # features of simulated data
est1 <- rep(NA,1000); est2 <- rep(NA,1000) # initialize the estimate stores
for(i in 1:1000){
  as.numeric(Sys.time())-> t; set.seed((t - floor(t)) * 1e8 -> seed) # set the seed to random seed
  y <- rnorm(N,sd=sd) # generate the data
  est1[i] <- optim(1,simllh,y=y,Ns=1000,lower=0.01)$par
  est2[i] <- optim(1,simllh.fix.seed,y=y,Ns=1000,lower=0.01)$par
}
hist(est1)
hist(est2)

Результирующие распределения оценок параметров:

Когда мы фиксируем семена, числовой поиск заканчивается ближе к истинному значению параметра 2 намного чаще.

2130
задан Anthon 25 March 2016 в 11:04
поделиться

4 ответа

Последовательность символов между < и> исключительно обращаются к заголовку, который является не обязательно файлом. Реализации являются в значительной степени бесплатными использовать последовательность символов, как они желают. (Главным образом, однако, просто рассматривайте его как имя файла и сделайте поиск в эти включает путь , как другие сообщения указывают.)

, Если эти #include "file" форма используется, реализация сначала ищет файл имени, если поддерживается. Если не (поддерживаемый), или если поиск перестал работать, реализация ведет себя, как будто другой (#include <file>) форма использовалась.

кроме того, третья форма существует и используется, когда #include директива не соответствует ни одной из форм выше. В этой форме некоторая основная предварительная обработка (такая как макрорасширение) сделана на "операндах" #include директива, и результат, как ожидают, будет соответствовать одной из двух других форм.

256
ответ дан Ayesh K 25 March 2016 в 11:04
поделиться

На практике различие находится в месте, где препроцессор ищет включенный файл.

Для #include <filename> препроцессор ищет зависящим от реализации способом, обычно поисковыми каталогами, предопределенными компилятором/IDE. Этот метод обычно используется для включения стандартных заголовочных файлов библиотеки.

Для #include "filename" препроцессор ищет сначала в том же каталоге как файл, содержащий директиву, и затем следует за путем поиска, используемым для эти #include <filename> форма. Этот метод обычно используется для включения определенных программистами заголовочных файлов.

А больше полного описания доступно в документации GCC относительно путей поиска .

1259
ответ дан Caleb 25 March 2016 в 11:04
поделиться
  • 1
    Вопрос isn' t о памяти доступа указатель указывает на, а скорее доступ к самому указателю (например, почему, даже просто делая printf (" %p\n" это), было бы неопределенное поведение после выполнения ' удалите this') – Jeremy Friesner 12 June 2014 в 05:43

Эти <file> включают, говорит препроцессору искать в -I каталоги и в предопределенных каталогах первый , затем в каталоге.c файла. Эти "file" включают, говорит препроцессору искать каталог исходного файла сначала , и затем возвращаться к -I и предопределенный. Все места назначения ищутся так или иначе, только порядок поиска отличается.

стандарт 2011 года главным образом обсуждает включать файлы в "16.2 включениях Исходного файла".

2 А, предварительно обрабатывающие директиву формы

# include <h-char-sequence> new-line

поиски последовательность определенных реализацией мест для заголовка, определенного исключительно указанной последовательностью между < и> разделители и причины замена той директивы всем контентом заголовка. Как места определяются, или определенный заголовок определяется реализацией.

3 А, предварительно обрабатывающие директиву формы

# include "q-char-sequence" new-line

причины, замена той директивы всем содержанием исходного файла определяется указанной последовательностью между "разделителями. Именованный исходный файл разыскивается определенным реализацией способом. Если этот поиск не поддерживается, или если поиск перестал работать, директива повторно обрабатывается, как будто это читало

# include <h-char-sequence> new-line

с идентичной содержавшей последовательностью (включая> символы, если таковые имеются) из исходной директивы.

Примечание, что "xxx" форма ухудшается к <xxx> форма, если файл не найден. Остальное определяется реализацией.

31
ответ дан Arkadiy 25 March 2016 в 11:04
поделиться
  • 1
    Это хорошо работает для меня, Версии 21.0.1180.89. Отметьте нажатую кнопку в виртуальной клавиатуре - nt4.com/ss/keydown-65.png . Возможно, Вы неправильно понимаете точно что it' s выполнение. Пока я ценю Ваши проблемы, они выходят за рамки исходного вопроса. @sunglim:thanks для того, чтобы замечать:) freeall: где начать... " Facebook Automation" " TextArea по сравнению с Input" " События KeyX по сравнению с Изменяющимся HTML Content"... все из объема. все остальные - это инициировало события, это doesn' t вводят для Вас. – Orwellophile 24 September 2012 в 13:35

Единственный способ знать состоит в том, чтобы прочитать документацию Вашей реализации.

В [1 114] стандарт C , разделите 6.10.2, абзацы 2 - 4 указывают:

  • директива предварительной обработки А формы

    #include <h-char-sequence> new-line
    

    поиски последовательность определенных реализацией мест для заголовок определенный исключительно указанной последовательностью между < и > разделители и причины замена той директивы всем содержанием заголовок . Как места указаны, или определенный заголовок определяется реализацией.

  • директива предварительной обработки А формы

    #include "q-char-sequence" new-line
    

    причины замена той директивы всем содержанием исходный файл определенный указанной последовательностью между эти " разделители. Именованное исходный файл разыскивается определенным реализацией способом. Если этот поиск не поддерживается, или если поиск перестал работать, директива повторно обрабатывается, как будто это читало

    #include <h-char-sequence> new-line
    

    с идентичной содержавшей последовательностью (включая > символы, если таковые имеются) из исходной директивы.

  • директива предварительной обработки А формы

    #include pp-tokens new-line
    

    (который не соответствует одной из двух предыдущих форм) разрешена. Маркеры предварительной обработки после include в директиве обрабатываются так же, как в обычном тексте. (Каждый идентификатор, в настоящее время определяемый как макро-имя, заменяется его заменяющим списком предварительной обработки маркеров.) Директива, заканчивающаяся после того, как, все замены должны соответствовать одной из двух предыдущих форм. Метод, которым последовательность предварительной обработки маркеров между < и > маркерная пара предварительной обработки или пара [1 111] символы объединены в единственный маркер предварительной обработки названия заголовка, определяется реализацией.

Определения:

  • h-символ: любой член исходного набора символов кроме символа новой строки и >

  • q-символ: любой член исходного набора символов кроме символа новой строки и "

671
ответ дан Fritz 25 March 2016 в 21:04
поделиться