표준 연습은 argv
을 사용하여 명령 줄 인수에 액세스하는 것입니다. 어떤 아키텍쳐에서는 다른 방법이 있다는 것을 알 수 있지만, 이식성이 없기 때문에 표준적인 방법으로는 가지 않을 이유가별로 없습니다. 당신이 사용할 수있는 하나의 int로 값을 읽으려면 strtol
long n = strtol(argv[1], NULL, 0);
(난 당신이 입력을 통해 좀 더 제어 및 오류 처리했습니다으로 atoi
에 strtol
을 사용하여 선호하는 경향이 있습니다 -하지만 많은되지 않음) 다음과 같이
또한 스트림을 사용할 수 있습니다
istringstream ss(argv[1]);
long n;
ss >> n;
당신이 생각 뭘 하려는지에 대해 저를 염려 할 두 가지
: 첫째로 당신이 원하는 실행시 설정 변수 값은 함수 내에서 캡슐화한다 . 논리적으로 이것은 당신의 함수와 외부 영향 (명령 행 매개 변수) 사이에 보이지 않는 의존성이 있기 때문에 코드의 유지 보수성을 떨어 뜨릴 것이므로 함수의 결정 론적 속성이 손상 될 것입니다. 실제적으로, 이것은 당신의 함수를 테스트하는 것을 훨씬 더 어렵게 만들 것입니다 - 특히 자동화 된 유닛 테스트를 사용하기 전에 값을 프로그램 적으로 실행하는 방법이 없으므로이를 사용하십시오.
둘째로, 이것을 합성하는 것처럼, 변수 이름이 a
인 변수의 범위를 이름없는 네임 스페이스 내의 컴파일 단위로 제한하려고합니다. 이것은 두 가지 바람직하지 않은 영향을 미칩니다. 첫째, 자동화 된 UT 관점에서이 변수를 다시 볼 수있는 테스트 장치 또는 기타 코드가 없다는 것은 매우 나쁜 것입니다. 둘째, a
은 컴파일 단위에서 효과적으로 '전역'이됩니다. 이 컴파일 단위의 함수 내에서 코드를 유지 관리하는 사람에게는 두통을 의미하는 a
이 사용되는 방법과시기를 따르는 것이 매우 까다로울 것입니다. 나는 당신이 정말로 문제를 야기 할 멀티 쓰레딩을 사용하지 않는다고 가정 할 것이다.
argv[1]
을 print_from_external_file()
에 전달하고 싶지 않은 이유를 알고 싶습니다.하지만 실제로 이것이 최선이라고 생각합니다.
configuration c(argc, argv); // This contains the hard work of parsing the CL
print_from_external_file(c);
이것은 대부분의 숨 깁니다 : 당신은 당신이 문자열로 직접이 변수를 전달하거나 int로 변환 할 수 있다고 생각하지 않는 경우에 전달 될 수있는 명령 줄 매개 변수 또는 구성 객체를 생성 고려할 수 커맨드 라인을 파싱하는 일.CL 매개 변수에 실제 의미를 추가 할 수 있습니다.
configuration::configuration(int argc, char* argv[])
{
// ...
catalogNo_ = strtol(argv[1], NULL, 0);
을 한 후 접근이 추가되는 경우 :의이 a
변수가 카탈로그 번호를 표시한다고 가정 해 봅시다, 당신의 configuration
클래스의 생성자는 단순히이 작업을 수행 할 수 있습니다
int configuration::get_catalog_no() const { return catalogNo_; }
을 그것은 훨씬 더 분명하게 in print_from_external_file()
우리가하는 일 :
void print_from_external_file(const configuration& c)
{
cout << c.get_catalog_no() << endl;
}
이것은 a가 main과 동일한 범위에서 정의된다고 가정합니다. 그것은 내 MWE의 경우가 아닙니다. – BillyJean