LINUX.ORG.RU

С++ и заголовочные файлы

 ,


0

1

Как правильно, так:

//
//MyFunc.h
//
#pragma once

namespace MySpace
{
	using std::string;
	//using namespace SystemCore;
class MyMethods
{
public:	
	static int УмножениеНаДва(int number);
};
}

//
//MyFunc.cpp
//
#include "stdafx.h"
#include "MyFunc.h"

using std::string;

int MySpace::MyMethods::УмножениеНаДва(int number)
{	
	return number*2;
}

или так:
//
//ТОЛЬКО MyFunc.h
//
#pragma once

namespace MySpace
{
	using std::string;
	//using namespace SystemCore;
class MyMethods
{
public:	
	static int MySpace::MyMethods::УмножениеНаДва(int number)
	{
		return number*2;
	}
};
}
???



Последнее исправление: ioexception (всего исправлений: 1)

В первом случае функция УмножениеНаДва() будет обычной, если она явно не описана как inline, а во втором - inline, т. е. по возможности (но не гарантированно) вместо вызова функции будет подставляться её тело. Только вот русских букв C++ не поддерживает, поэтому назвать надо как-то по-другому, а то ведь этот пример и не откомпилишь

aureliano15 ★★
()
Ответ на: комментарий от ioexception

В общем случае не плохо и не хорошо. На inline-функции накладывается ряд ограничений (нельзя исп. рекурсии, циклы, переходы goto, ассемблерные вставки, может ещё чего забыл). Кроме того, если код функции достаточно велик, то многократно вызываемые inline'ы могут значительно увеличить код. Плюс компилируются они каждый раз заново, а значит увеличивают время компиляции. Зато экономия на вызове функции и возврате из неё (вроде бы мелочь, но операции перехода довольно дорогие, поэтому сэкономить на них порой имеет смысл). В данном случае inline подходит, если бы функция занимал 2 экрана, то лучше бы использовать вызов вместо вставки.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

Только вот русских букв C++ не поддерживает, поэтому назвать надо как-то по-другому, а то ведь этот пример и не откомпилишь

Нормально все компилируется и работает, зачем ангилийский использовать, когда по русски тоже можно, гораздо понятнее.

ioexception
() автор топика

#include «stdafx.h»

На винфак.

Begemoth ★★★★★
()
Ответ на: комментарий от aureliano15

а во втором - inline, т. е. по возможности (но не гарантированно) вместо вызова

почти всегда. распухает бинарник

На inline-функции накладывается ряд ограничений (нельзя исп. рекурсии, циклы, переходы goto, ассемблерные вставки

ЩИТО?

dib2 ★★★★★
()
Ответ на: комментарий от ioexception

Специально попробовал откомпилять в g++, слегка модифицировав:

namespace MySpace
{
class MyMethods
{
public:	
	static int УмножениеНаДва(int number);
};
}

#include <stdio.h>

int MySpace::MyMethods::УмножениеНаДва(int number)
{	
	return number*2;
}

int main()
{
  printf("%i\n", MySpace::MyMethods::УмножениеНаДва(2));
  return 0;
}

Вот вывод компилятора:

~$ g++ -Wall -o test test.cpp
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\243»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\274»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\275»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\276»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\266»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\265»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\275»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\270»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\265»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\235»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\260»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\224»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\262»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:7:2: ошибка: в программе обнаружен некорректный символ «\260»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\243»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\274»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\275»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\276»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\266»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\265»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\275»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\270»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\265»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\235»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\260»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\224»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\262»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:13:1: ошибка: в программе обнаружен некорректный символ «\260»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\243»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\274»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\275»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\276»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\266»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\265»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\275»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\270»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\265»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\235»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\260»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\224»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\262»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\320»
test.cpp:20:3: ошибка: в программе обнаружен некорректный символ «\260»
test.cpp:7:42: ошибка: expected unqualified-id before «int»
test.cpp:7:42: ошибка: expected «)» before «int»
test.cpp:13:53: ошибка: expected unqualified-id before «(» token
test.cpp: В функции «int main()»:
test.cpp:20:66: ошибка: expected unqualified-id before «(» token

Компилятор g++ 4.6.3.

Если на C# или на каких-то других левых компиляторах такое возможно, то это не значит, что это разрешено стандартом. На большинстве компиляторов будет ошибка. Я уже не говорю о проблемах с разными кодировками, про невозможность интернациональной поддержки (если программист не знает русского языка, и у него не установлена кириллица), о необходимости переключаться с одного регистра на другой (ведь можно просто забыть) и о наличии разных символов, которые пишутся одинаково, а символы C и С не только пишутся одинаково, но и нарисованы на одной кнопке. Поэтому очень не советую использовать в C++-коде русские буквы (да и в любом другом по возможности тоже).

aureliano15 ★★
()
Ответ на: комментарий от dib2

На inline-функции накладывается ряд ограничений (нельзя исп. рекурсии, циклы, переходы goto, ассемблерные вставки

ЩИТО?

Извиняюсь. Давно (ещё в 90-ые) где-то вычитал и до сего дня был уверен, что это так. Сейчас попробовал - вроде можно. Видимо это касалось отдельных компиляторов тех времён (я в то время писал на turbo c++/borland c++).

aureliano15 ★★
()
Ответ на: комментарий от dib2

ЩИТО?

То. Хотя это компиляторо-зависимо. И никаких фатальных последствий не будет — она просто не заинлайнится (возможно, с варнингом).

alegz ★★★★
()
Ответ на: комментарий от aureliano15

Ты проверь, действительно ли она в код вставилась в таком виде. Не факт, в общем случае — inline не обязанность компилятора, а рекомендация.

alegz ★★★★
()
Ответ на: комментарий от dib2

почти всегда. распухает бинарник

Если эвристика компилятора покажет, что функция слишком «большая», то незаинлайнится

annulen ★★★★★
()
Ответ на: комментарий от aureliano15

Только вот русских букв C++ не поддерживает, поэтому назвать надо как-то по-другому, а то ведь этот пример и не откомпилишь

GCC не поддерживает, clang, например, может.

DarkEld3r ★★★★★
()
Ответ на: комментарий от alegz

Кстати да. Создал вот такой файлик test_inline.cpp:

#include <stdio.h>

inline int f_inline(int x)
{
  return x+x;
}

inline int f_asm(int x)
{
  asm("nop");
  return x+x;
}

inline int f_goto(int x)
{
  int n=x+x;
  l: x+=1;
  if(x<n)
    goto l;
  return x;
}

inline int f_for(int x)
{
  int i, n=x;
  for(i=0; i<n; ++i)
    ++x;
  return x;
}

int main(void)
{
  printf("f=%i, f_asm=%i, f_goto=%i, f_for=%i\n", f_inline(3), f_asm(3), f_goto(3), f_for(3));
  return 0;
}

Откомпилировав его с опциями

g++ -S -Wall -finline-functions test_inline.cpp

получил такой ассемблерный листинг test_inline.s:

# Здесь чтой-то на ассемблере...
# ...
        call    _Z5f_fori
        movl    %eax, %r13d
        movl    $3, %edi
        call    _Z6f_gotoi
        movl    %eax, %r12d
        movl    $3, %edi
        call    _Z5f_asmi
        movl    %eax, %ebx
        movl    $3, %edi
        call    _Z8f_inlinei
        movl    %r13d, %r8d
        movl    %r12d, %ecx
        movl    %ebx, %edx
        movl    %eax, %esi
        movl    $.LC0, %edi
        movl    $0, %eax
        call    printf
# Здесь снова чтой-то на ассемблере...
# ...

Мы видим, что код вызывает, а не встраивает все функции, включая законную во всех смыслах f_inline(). Хотя я дал на всякий случай ещё и опцию -finline-functions помимо директив inline. Ну ладно, м. б. при генерации ассемблерного листинга инлайны не учитываются. Откомпилял нормально с опциями -g2 и всё той же -finline-functions, и снова backtrace показывает мне вызов всех функций, включая f_inline. Так что похоже g++ (по крайней мере моя версия) инлайны не поддерживает. Или я что-то не понимаю.

aureliano15 ★★
()
Ответ на: комментарий от DarkEld3r

Достаточно того, что хотя бы часть современных компиляторов не поддерживает. Причём совсем не малоизвестных компиляторов, а скорее наоборот.

aureliano15 ★★
()
Ответ на: комментарий от Stil

http://stackoverflow.com/questions/5676978/unicode-identifiers-and-source-cod...

Ну допустим даже, что стандарт C++11 допускает, хотя и там мы видим вопросы: какой конкретно вариант юникода, какой порядок байт и т. д. Но сообщение датировано 11 г., последний раз его правили в 13 г., а воз и ныне там: g++ не поддерживает, и правильно не поддерживает, я считаю, нечего всякую фигню поддерживать. Смею предположить, что этот стандарт ждёт печальная судьба 7-уровневой модели OSI: долго пытались заставить разработчиков её реализовать, в конце концов притянули за уши к существующему стеку TCP/IP и успокоились.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

я считаю, нечего всякую фигню поддерживать

Мне наплевать, что ты считаешь, с этим к Эдди. По стандарту идентификаторы могут быть кириллическими.

Stil ★★★★★
()
Ответ на: комментарий от aureliano15

Мы видим

Мы видим.

что код вызывает

Что пацан конпелятор не из идеешечке заюзал 1-й раз, а почитать мануал дак вообще поклал.

а не встраивает все функции

Да ты чё, давай поможем пацану понять в чем дело, допустим загуглить «g++ default optimization level».

Хотя я дал на всякий случай ещё и опцию -finline-functions помимо директив inline

А вот оптимизацию врубить не осилил.

Ну ладно, м. б. при генерации ассемблерного листинга инлайны не учитываются.

Это как так? Как ты себе это представляешь?

Откомпилял нормально с опциями -g2
нормально
с опциями -g2

Ну ты понял, да?

Так что похоже g++ (по крайней мере моя версия) инлайны не поддерживает.

Естественно конпелятор не поддерживает основную оптимизацию.

Инлайн - это оптимизация, и даже в си, где инлайн гарантирует отсутствие тела, без оптимизации всё ровно будет сгинерен call, хотя самих функция тю-тю.

/tmp/ccHseDRB.o: In function `main':
test_inline.c:(.text+0x13): undefined reference to `f_for'
test_inline.c:(.text+0x20): undefined reference to `f_goto'
test_inline.c:(.text+0x2d): undefined reference to `f_asm'
test_inline.c:(.text+0x39): undefined reference to `f_inline'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1

Или я что-то не понимаю.

Да, да, ты нашёл причину - поздравляю.

main:
.LFB34:
	.cfi_startproc
	subq	$8, %rsp
	.cfi_def_cfa_offset 16
#APP
# 10 "test_inline.cpp" 1
	nop
# 0 "" 2
#NO_APP
	movl	$6, %r9d
	movl	$6, %r8d
	movl	$6, %ecx
	movl	$6, %edx
	movl	$.LC0, %esi
	movl	$1, %edi
	xorl	%eax, %eax
	call	__printf_chk
	xorl	%eax, %eax
	addq	$8, %rsp
	.cfi_def_cfa_offset 8
	ret
TrueTsar1C
()
Ответ на: комментарий от Stil

Да, ради бога. Плюй. И пиши по стандарту, не поддерживаемому компиляторами, потому что разработчикам компиляторов походу тоже наплевать, что ты считаешь, равно как и на разные идиотские нововведения в стандарте.

aureliano15 ★★
()
Ответ на: комментарий от ioexception

УмножениеНаДва

Удвоить же! А то как акын: что какое выражение в функции, такое и название. Уже скатываешься со своими русскими буквами.

Автодополнение в IDE работает на таких идентификаторах?

ziemin ★★
()
Ответ на: комментарий от TrueTsar1C

Что пацан конпелятор не из идеешечке заюзал 1-й раз

Пацан, «идеешечками» в последний раз я пользовался много лет назад. Я не бравирую этим, а просто сообщаю. А ещё я хочу сказать на будущее, что общаться в таком тоне не намерен. Поэтому или мы общаемся вежливо, или просто можешь проигнорировать это сообщение.

А вот оптимизацию врубить не осилил.

Я намеренно не указывал опции -O, чтобы не оптимизировать ничего лишнего. Но, как ни странно, опция -O3 действительно не стала генерить функций ни в ассемблерном листинге, ни в объектном коде. Хотя по идее директивы inline должно быть достаточно.

с опциями -g2

Ну ты понял, да?

А что я должен понять? Опция -g2 добавляет в объектник отладочную информацию. Без неё ты вообще никаких имён там не увидишь в дебагере, только адреса. Я и сейчас компилировал с этой опцией.

PS: а за подсказку использовать -O3 спасибо. Не знал, что это необходимо для встраивания функций, даже если указана директива inline.

aureliano15 ★★
()
Ответ на: комментарий от aureliano15

Пацан, «идеешечками» в последний раз я пользовался много лет назад.

Зачем мне твои ля-ля?

Я не бравирую этим, а просто сообщаю. А ещё я хочу сказать на будущее, что общаться в таком тоне не намерен.

Каком тоне? Ты мне условия ставишь? Мне насрать.

Я намеренно не указывал опции -O

И что ты этим добился?

чтобы не оптимизировать ничего лишнего.

И как же это возможно? Что оно там может заоптимизировать, если не заинлайнит, а если заинлайнет, то всем насрать, что там из твоего кода получиться.

Зачем думать перед тем как что-то делать, да?

Опция -g2 добавляет в объектник отладочную информацию.

Датычё.

Без неё ты вообще никаких имён там не увидишь в дебагере

Не ну тут явно маздай покусал.

только адреса.

Эти куллстори, эти куллстори.

eading symbols from ./a.out...(no debugging symbols found)...done.//да, да
(gdb) disassemble main//да, да
Dump of assembler code for function main:
   0x0000000000400616 <+0>:     push   %rbp
   0x0000000000400617 <+1>:     mov    %rsp,%rbp
   0x000000000040061a <+4>:     push   %r13
   0x000000000040061c <+6>:     push   %r12
   0x000000000040061e <+8>:     push   %rbx
   0x000000000040061f <+9>:     sub    $0x8,%rsp
   0x0000000000400623 <+13>:    mov    $0x3,%edi
   0x0000000000400628 <+18>:    callq  0x4006bb <_Z5f_fori>//ахринеть, да?
   0x000000000040062d <+23>:    mov    %eax,%r13d
   0x0000000000400630 <+26>:    mov    $0x3,%edi
   0x0000000000400635 <+31>:    callq  0x400699 <_Z6f_gotoi>
   0x000000000040063a <+36>:    mov    %eax,%r12d
   0x000000000040063d <+39>:    mov    $0x3,%edi
   0x0000000000400642 <+44>:    callq  0x40068a <_Z5f_asmi>
   0x0000000000400647 <+49>:    mov    %eax,%ebx
   0x0000000000400649 <+51>:    mov    $0x3,%edi
   0x000000000040064e <+56>:    callq  0x40067c <_Z8f_inlinei>
   0x0000000000400653 <+61>:    mov    %r13d,%r8d
   0x0000000000400656 <+64>:    mov    %r12d,%ecx
   0x0000000000400659 <+67>:    mov    %ebx,%edx
   0x000000000040065b <+69>:    mov    %eax,%esi
   0x000000000040065d <+71>:    mov    $0x400778,%edi
   0x0000000000400662 <+76>:    mov    $0x0,%eax
   0x0000000000400667 <+81>:    callq  0x4004f0 <printf@plt>
   0x000000000040066c <+86>:    mov    $0x0,%eax
   0x0000000000400671 <+91>:    add    $0x8,%rsp
   0x0000000000400675 <+95>:    pop    %rbx
   0x0000000000400676 <+96>:    pop    %r12
   0x0000000000400678 <+98>:    pop    %r13
   0x000000000040067a <+100>:   pop    %rbp
   0x000000000040067b <+101>:   retq   
End of assembler dump.
break _Z5f_asmi
Breakpoint 1 at 0x40068e
(gdb) run
Breakpoint 1, 0x000000000040068e in f_asm(int) ()
(gdb) bt
#0  0x000000000040068e in f_asm(int) ()
#1  0x0000000000400647 in main ()

И о5 я вижу автострип в идешке, либо балабольство.

Я и сейчас компилировал с этой опцией.

Молодец.

PS: а за подсказку использовать -O3 спасибо.

Суть не в O3, да и я тебе не подсказывал про O3, да и я о нём вообще не говорил, а суть в том, что вырубив оптимизации говорить, что инлайн не работает крайне глупо.

А то, что ты написал -finline-functions не прочитав, а что же вообще делает эта опция - тоже. Если бы ты прочитал - ты бы узнал, что опция НЕ влияет на объявленные как инлайн функции и какбэ ваще не врубает инлайн.

Не знал, что это необходимо для встраивания функций

Ещё раз, инлайн - это потимизация. Оптимизация это то, что меняет, т.е. преобразует твой код.

Каким макаром тебе конпелятор её встроит, если он обязан транслировать твой код 1в1.

Скорее всего твоя проблема в том, что ты думал, что -finline-functions отвечает за врубание самого инлайна, но нет. Но какбэ надо подумать, а потом запостить. Хотябы сравнить с O1.

TrueTsar1C
()
Ответ на: комментарий от ioexception

Я про мозг, читать и писать на одном языке удобнее и быстрее, чем постоянно переключаясь с одного на другой.

Begemoth ★★★★★
()
Ответ на: комментарий от alegz

То. Хотя это компиляторо-зависимо.

и было при царе горохе

И никаких фатальных последствий не будет — она просто не заинлайнится (возможно, с варнингом).

собственно да

dib2 ★★★★★
()
Ответ на: комментарий от aureliano15

Достаточно того, что хотя бы часть современных компиляторов не поддерживает.

Да я, в общем-то, не спорю, просто дополнил. Вроде, даже в GCC можно как-то «включить поддержку» русского.

Сам тоже считаю это извращением.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Когда-то очень давно и очень недолго я писал ещё на Яве-2. В общем-то язык мне в целом понравился (я не об эффективности, а именно в целом), но там с самого начала можно было использовать кириллицу в идентификаторах. Я, разумеется, этой возможностью не пользовался, но однажды случайно вместо латинской Цэ ввёл русскую Эс, которые и выглядят одинаково, и расположены на одной клавише. Т. о. в объявлении переменной у меня была Цэ, а в коде - Эс (или наоборот, неважно), и компилятор, вместо того, чтобы сказать, что у меня какой-то недопустимый символ, начал мне говорить, что у меня не объявлена переменная. Проверяю - объявлена. В конце концов понял, конечно, в чём дело, но потратил минут 5, с тех пор считаю добавление подобных возможностей в языки программирования вредительством.

aureliano15 ★★
()
Ответ на: комментарий от dib2

и было при царе горохе
собственно да

Ты никакого противоречия не видишь, не?

Вроде уже согласились, что inline — не обязанность компилятора, а рекомендация. По какой конкретно причине он не захочет инлайнить функцию — зависит от компилятора. Одному не понравится цикл в теле, техасовские, например, не инлайнят функции, возвращающие структуру на стеке и т. д.

alegz ★★★★
()
Ответ на: комментарий от dib2

все равно повторит в каждой единице трансляции

повторить-то повторит, но в конце для каждого слабого символа линкер оставит только одну копию. Безо всякого LTO.

annulen ★★★★★
()

Ну и какого хрена это хуйло еще не забанили?

anonymous
()

язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан язабан

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.